Récemment, Elasticsearch 5.4 (ES) est une version relativement nouvelle. Il y a de nombreux problèmes pendant l'utilisation, ce qui est un mal de tête, mais le problème a finalement été résolu.
Question 1: Esclient est lent à obtenir, et le client ne peut pas être obtenu: Échec de la création d'une boucle d'événement enfant
Étant donné que l'entreprise doit télécharger un lot de fichiers sans télécharger un index ES, vous devez obtenir une connexion, puis fonctionner à chaque fois que vous ajoutez un index. Surtout dans les grands lots, le nombre d'acquisitions est évidemment très grand. La raison principale de ce problème est que nous opérons fréquemment ES en boucles. Par exemple, nous devons obtenir 100 fichiers dans un lot. Afin de réduire le temps d'obtention du client ES, nous avons finalement adopté une solution, c'est-à-dire initialiser la connexion au démarrage du service, l'obtenir en même temps, puis l'appeler directement plus tard. Une fois l'ensemble du fichier batch téléchargé, l'index ES est finalement ajouté, au lieu d'ajouter un fichier à la fois. Cette méthode ne nécessite évidemment pas chaque lot pour obtenir des connexions, ce qui améliore considérablement l'efficacité de l'exécution.
Tout d'abord, lorsque le service est démarré, nous initialisons le client statique ES dans la classe de démarrage:
ELLASTICSEARCHUTIL STATIQUE PRIVÉE ELASTICSEARCHUTIL = NOUVEAU ELASTICSEARCHUTIL (); Client de transport statique public = elasticsearchutil.getClient ();
Puis appelez-le directement lorsqu'il est utilisé:
Client client = main.client;
Cela peut réduire considérablement le nombre de connexions au client ES, améliorant ainsi l'efficacité.
Le code ES est le suivant:
TransportClientClient GetClient () {String [] iparr = configUtil.getValue ("ESIP"). Split (","); Settings Settings = Settings.builder (). Put ("thread_pool.generic.core", 5) .put ("thread_pool.generic.max", 10) .put ("Processeurs", 5) .put (Constants.esclusterName, configUtil.getValue ("CluSterName")). Build (); TransportClient client = new prebuiltTransportClient (paramètres); pour (String ip: iparr) {TransportAddress Adresse = new IneTSocketTransportAddress (InetAddress.Forstring (ip), 9300); client.addtransportAddress (adresse);} return client;}Question 2: débordement de la mémoire: java.lang.outofMemory: Impossible de créer un nouveau fil natif
Pendant le processus de développement du projet, le débordement de la mémoire est une chose très gênante. Je l'ai rencontré pendant l'utilisation de l'ES, et c'était très fréquent, en particulier lors des tests de contrainte à grande échelle. J'ai pensé à de nombreuses façons d'optimiser la mémoire JVM, mais il n'y avait aucun effet, et le problème n'a toujours pas été résolu. Enfin, en regardant le code source, j'ai trouvé une raison. Combiné avec des exceptions de signalement des erreurs, cela est dû au fait qu'un grand nombre de threads ont été automatiquement créés pendant l'utilisation avec ES, ce qui a dépassé la capacité du système, ce qui a conduit au débordement de la mémoire. Lors de l'étude du code source, j'ai constaté que le nombre de threads créés par ES peut être contrôlé via des paramètres. Voici le nombre par défaut de threads de création ES:
thread_pool.generic.core = valeur par défaut --- 4thread_pool.generic.max = valeur par défaut - min (512, max (4 * numéro de processeur, 128))
Notre processeur est de 10 cœurs et 40 fils
À en juger par les résultats du calcul, si la valeur par défaut est utilisée, le nombre de threads que ES peut créer est une grande valeur, qui est bien au-delà de la capacité du système lui-même. Il ajuste principalement la valeur de réglage. Après ajustement, nous modifions la valeur par défaut de l'ES comme suit:
Settings Settings = Settings.builder (). Put ("thread_pool.generic.core", 5) .put ("thread_pool.generic.max", 10) .put ("processeurs", 5) .put (constants.esclusterName, configUtil.getValue ("ClusterName")). Build (); Ceci est les paramètres précédents Settings = Settings.builder (). Put ("thread_pool.generic.core", 5) .put (constants.esclusterName, configUtil.getValue ("ClusterName")). Build ();Après les tests, ES a créé un très petit nombre de threads et répondu à nos besoins de développement, et il n'y avait plus de problème de débordement de mémoire.
Le résumé ci-dessus des questions communes basées sur Elasticsearch 5.4 est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.