#arrays #elasticsearch #kibana
#массивы #elasticsearch #kibana
Вопрос:
У меня есть рабочий производственный кластер elasticsearch с несколькими узлами данных. Один из моих индексов в этом кластере содержит документы следующего типа:
{
"user_id": 12131,
"samples": [1324, 1314, 1414, 984, .....]
}
Ограничения на это просто заключаются в том, что user_id
это уникально для всех документов, и samples
массив должен иметь уникальные номера в одном документе. Эта структура прекрасно работает уже много лет. В последнее время это стало давать мне огромное время на индексацию. Я отслеживаю это время индексации через Kibana. Я также заметил, что загрузка процессора парой узлов данных очень высока. Я понимаю, что мой samples
массив доступен для поиска, и не из-за большого количества данных в нем время индексации этих документов стремительно растет. Я хочу эффективно вставлять новые целые числа в эти документы. Я согласен с тем, что эти массивы образцов не доступны для поиска или не маркированы.
Вопросы:
- Как определить, какие документы конкретно требуют огромного времени индексации?
- Возможно ли, что
samples
массив сильно вырос в нескольких документах, и именно поэтому добавление новых целых чисел в массив занимает много времени? - Как я могу увеличить время индексации?
- Я также заметил, что размеры сегментов неравномерны. Два узла с высокой загрузкой ЦП имеют 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.