Быстрая индексация целых массивов в elasticsearch

#arrays #elasticsearch #kibana

#массивы #elasticsearch #kibana

Вопрос:

У меня есть рабочий производственный кластер elasticsearch с несколькими узлами данных. Один из моих индексов в этом кластере содержит документы следующего типа:

 {
 "user_id": 12131,
 "samples": [1324, 1314, 1414, 984, .....]
}

 

Ограничения на это просто заключаются в том, что user_id это уникально для всех документов, и samples массив должен иметь уникальные номера в одном документе. Эта структура прекрасно работает уже много лет. В последнее время это стало давать мне огромное время на индексацию. Я отслеживаю это время индексации через Kibana. Я также заметил, что загрузка процессора парой узлов данных очень высока. Я понимаю, что мой samples массив доступен для поиска, и не из-за большого количества данных в нем время индексации этих документов стремительно растет. Я хочу эффективно вставлять новые целые числа в эти документы. Я согласен с тем, что эти массивы образцов не доступны для поиска или не маркированы.

Вопросы:

  1. Как определить, какие документы конкретно требуют огромного времени индексации?
  2. Возможно ли, что samples массив сильно вырос в нескольких документах, и именно поэтому добавление новых целых чисел в массив занимает много времени?
  3. Как я могу увеличить время индексации?
  4. Я также заметил, что размеры сегментов неравномерны. Два узла с высокой загрузкой ЦП имеют 500 МБ данных этого индекса, а другие узлы имеют около 250 МБ. Это почти вдвое больше данных на этих двух узлах.

Время индексации этого индекса составляет около 40-100 секунд. Все мои другие индексы были быстрыми при индексации, и они в 10 раз превышают данные этого индекса. Пожалуйста, дайте мне знать, если требуется какая-либо конкретная метрика. Спасибо.

Правки:

Ниже приведен вывод GET /_nodes/hot_threads для одного из узлов с большим временем индексации.

 82.9% (414.4ms out of 500ms) cpu usage by thread 'elasticsearch[ip-node-ip][refresh][T#2]'
     4/10 snapshots sharing following 29 elements
       org.apache.lucene.codecs.PushPostingsWriterBase.writeTerm(PushPostingsWriterBase.java:156)
       org.apache.lucene.codecs.blocktree.BlockTreeTermsWriter$TermsWriter.write(BlockTreeTermsWriter.java:866)
       org.apache.lucene.codecs.blocktree.BlockTreeTermsWriter.write(BlockTreeTermsWriter.java:344)
       org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsWriter.write(PerFieldPostingsFormat.java:140)
       org.apache.lucene.index.FreqProxTermsWriter.flush(FreqProxTermsWriter.java:109)
       org.apache.lucene.index.DefaultIndexingChain.flush(DefaultIndexingChain.java:173)
       org.apache.lucene.index.DocumentsWriterPerThread.flush(DocumentsWriterPerThread.java:444)
       org.apache.lucene.index.DocumentsWriter.doFlush(DocumentsWriter.java:539)
       org.apache.lucene.index.DocumentsWriter.flushAllThreads(DocumentsWriter.java:653)
       org.apache.lucene.index.IndexWriter.getReader(IndexWriter.java:445)
       org.apache.lucene.index.StandardDirectoryReader.doOpenFromWriter(StandardDirectoryReader.java:291)
       org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:266)
       org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:256)
       org.apache.lucene.index.FilterDirectoryReader.doOpenIfChanged(FilterDirectoryReader.java:104)
       org.apache.lucene.index.DirectoryReader.openIfChanged(DirectoryReader.java:140)
       org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:156)
       org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:58)
       org.apache.lucene.search.ReferenceManager.doMaybeRefresh(ReferenceManager.java:176)
       org.apache.lucene.search.ReferenceManager.maybeRefreshBlocking(ReferenceManager.java:253)
       org.elasticsearch.index.engine.InternalEngine.refresh(InternalEngine.java:883)
       org.elasticsearch.index.shard.IndexShard.refresh(IndexShard.java:632)
       org.elasticsearch.index.IndexService.maybeRefreshEngine(IndexService.java:690)
       org.elasticsearch.index.IndexService.access$400(IndexService.java:92)
       org.elasticsearch.index.IndexService$AsyncRefreshTask.runInternal(IndexService.java:832)
       org.elasticsearch.index.IndexService$BaseAsyncTask.run(IndexService.java:743)
       org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:569)
       java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
       java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
       java.lang.Thread.run(Thread.java:748)
     6/10 snapshots sharing following 26 elements
       org.apache.lucene.codecs.perfield.PerFieldPostingsFormat$FieldsWriter.write(PerFieldPostingsFormat.java:140)
       org.apache.lucene.index.FreqProxTermsWriter.flush(FreqProxTermsWriter.java:109)
       org.apache.lucene.index.DefaultIndexingChain.flush(DefaultIndexingChain.java:173)
       org.apache.lucene.index.DocumentsWriterPerThread.flush(DocumentsWriterPerThread.java:444)
       org.apache.lucene.index.DocumentsWriter.doFlush(DocumentsWriter.java:539)
       org.apache.lucene.index.DocumentsWriter.flushAllThreads(DocumentsWriter.java:653)
       org.apache.lucene.index.IndexWriter.getReader(IndexWriter.java:445)
       org.apache.lucene.index.StandardDirectoryReader.doOpenFromWriter(StandardDirectoryReader.java:291)
       org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:266)
       org.apache.lucene.index.StandardDirectoryReader.doOpenIfChanged(StandardDirectoryReader.java:256)
       org.apache.lucene.index.FilterDirectoryReader.doOpenIfChanged(FilterDirectoryReader.java:104)
       org.apache.lucene.index.DirectoryReader.openIfChanged(DirectoryReader.java:140)
       org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:156)
       org.apache.lucene.search.SearcherManager.refreshIfNeeded(SearcherManager.java:58)
       org.apache.lucene.search.ReferenceManager.doMaybeRefresh(ReferenceManager.java:176)
       org.apache.lucene.search.ReferenceManager.maybeRefreshBlocking(ReferenceManager.java:253)
       org.elasticsearch.index.engine.InternalEngine.refresh(InternalEngine.java:883)
       org.elasticsearch.index.shard.IndexShard.refresh(IndexShard.java:632)
       org.elasticsearch.index.IndexService.maybeRefreshEngine(IndexService.java:690)
       org.elasticsearch.index.IndexService.access$400(IndexService.java:92)
       org.elasticsearch.index.IndexService$AsyncRefreshTask.runInternal(IndexService.java:832)
       org.elasticsearch.index.IndexService$BaseAsyncTask.run(IndexService.java:743)
       org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:569)
       java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
       java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
       java.lang.Thread.run(Thread.java:748)
 

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать данные из API горячих потоков для узлов с высоким процессором? Также, если вам не нужно искать, samples вы можете просто установить "index": false в сопоставлении .

2. @ilvar Привет, я добавил ответ hot_threads одного из узлов. Спасибо.

3. Да, это определенно обработка терминов при записи. Попробуйте пометить это поле как неиндексированное (хотя вам придется заново создать индекс).

4. Можете ли вы сказать мне, какой из этих классов обозначает эту обработку записи? Я хотел бы сосредоточиться на конкретных классах и их операциях, если воссоздание индекса для нас невозможно. Спасибо.

5. Весь процессор потребляется, org.apache.lucene.index.FreqProxTermsWriter который, по-видимому, записывает термины. Вы можете использовать API переиндексации , если нет копии данных за пределами Elasticsearch.