Recentemente, o Elasticsearch 5.4 (es) é uma versão relativamente nova. Existem muitos problemas durante o uso, o que é uma dor de cabeça, mas o problema foi finalmente resolvido.
Pergunta 1: Esclient é recuperado lentamente e não pode ser recuperado: Falha ao criar um loop de evento infantil
Como a empresa precisa fazer upload de um lote de arquivos sem fazer upload de um índice ES, você precisa obter uma conexão e depois operar cada vez que adicionar um índice. Especialmente em lotes grandes, o número de aquisições é obviamente muito grande. A principal razão para esse problema é que frequentemente operamos ES nos loops. Por exemplo, precisamos obter 100 arquivos em um lote. Para reduzir o tempo de obtenção do cliente ES, finalmente adotamos uma solução, ou seja, inicialize a conexão quando o serviço iniciar, obtê -lo ao mesmo tempo e depois chamá -lo diretamente posteriormente. Depois que todo o arquivo em lote é carregado, o índice ES é finalmente adicionado, em vez de adicionar um arquivo por vez. Obviamente, esse método não exige cada lote para obter conexões, o que melhora muito a eficiência da execução.
Primeiro, quando o serviço é iniciado, inicializamos o cliente estático ES na aula de inicialização:
ElasticSearchTearch de pesquisa privada ElasticsearchTil = new Elasticsearchutil (); cliente estático public estático Client = Elasticsearchutil.getClient ();
Em seguida, chame diretamente quando usado:
Cliente cliente = main.client;
Isso pode reduzir bastante o número de conexões com o cliente ES, melhorando assim a eficiência.
O código ES é o seguinte:
public TransportClient getClient () {String [] iParr = configutil.getValue ("Esip"). Split (","); Configurações Configurações = Settings.builder (). Put ("Thread_pool.generic.core", 5) .put ("Thread_pool.generic.max", 10). .put (constants.esclustername, configuil.getValue ("clustername")). build (); transportclient client = new pré -BuiltTransportClient (configurações); para (string ip: iparr) {transportAddress endereço = new inetSockettransportAddress (inetAddresses.ForString (IP), 9300); client.addtransportAddresses (endereço);} retornar cliente;}Pergunta 2: Memória Overflow: java.lang.outofmemory: Não é possível criar um novo thread nativo
Durante o processo de desenvolvimento do projeto, o excesso de memória é uma coisa muito problemática. Eu o encontrei durante o uso do ES, e era muito frequente, especialmente durante os testes de estresse em larga escala. Pensei em muitas maneiras de otimizar a memória da JVM, mas não houve efeito, e o problema ainda não foi resolvido. Finalmente, ao olhar para o código -fonte, encontrei um motivo. Combinado com exceções de relatórios de erros, isso ocorre porque um grande número de threads foi criado automaticamente durante o uso com ES, que excedeu a capacidade do sistema, o que levou ao transbordamento da memória. Ao estudar o código -fonte, descobri que o número de threads criados pelo ES pode ser controlado por meio de configurações. Aqui está o número padrão de threads de criação ES:
thread_pool.generic.core = Valor padrão --- 4THREAD_POOL.GENERIC.MAX = Valor padrão-min (512, max (número 4*do processador, 128)) Número do processador = Número do processador da CPU
Nossa CPU é de 10 núcleos e 40 threads
A julgar pelos resultados do cálculo, se o valor padrão for usado, o número de threads que o ES pode criar é um grande valor, que está muito além da capacidade do próprio sistema. Ajusta principalmente o valor de configuração. Após o ajuste, alteramos o valor padrão de ES da seguinte maneira:
Configurações Configurações = Settings.Builder (). PUT ("Thread_pool.generic.core", 5) .put ("Thread_pool.generic.max", 10) .put ("Processors", 5) .put (constantes.esclustername, configutil.getValue ("clustername").). Essas são as configurações anteriores das configurações = Settings.builder (). Put ("thread_pool.generic.core", 5) .put (constants.esclustername, configutil.getValue ("clustername")). Build ();Após o teste, o ES criou um número muito pequeno de threads e atendeu às nossas necessidades de desenvolvimento, e não houve problema de transbordamento de memória novamente.
O resumo acima das perguntas comuns com base no Elasticsearch 5.4 é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.