Как я могу запретить Elasticsearch использовать так много памяти?

Я пытаюсь использовать Kibana для визуализации некоторых записей Bro, которые я добавил в Elasticsearch. Я загрузил записи примерно за 1 месяц (всего около 3 миллиардов записей и около 4 ТБ). Данные принимаются и индексируются без проблем. Я могу создать несколько простых визуализаций в Kibana, но когда я пытаюсь загрузить созданную мной панель инструментов (которая включает в себя 12 различных визуализаций и запускает как минимум столько же запросов Elasticsearch), я начинаю получать ошибки.

Я запускаю кластер Elasticsearch из 7 узлов с 5 узлами данных:

host001 192.168.1.1 18  8  0.00 - * Feron  
host002 192.168.1.2 15  8  0.00 - - Dark Phoenix    
host003 192.168.1.3 58 21  0.25 d - Starbolt          
host004 192.168.1.4 37 23  0.07 d - Niles Van Roekel  
host005 192.168.1.5 47 29  0.10 d - Angel Salvadore    
host006 192.168.1.6 68 29 16.37 d - Candra            
host007 192.168.1.7 56 29 14.36 d - Algrim the Strong

Основные моменты ошибок elasticsearch.log заключаются в следующем:

Набор этих строк для разных полей (прерыватели срабатывают при использовании слишком большого объема памяти для данных поля, что, я думаю, является ядром моей проблемы):

[2015-10-06 08:24:00,265][ПРЕДУПРЕЖДЕНИЕ ][indices.breaker ] [Эрик Слотер] [FIELDDATA] Новая используемая память 3752926600 [3,4 ГБ] из поля [AA] будет больше, чем настроенный прерыватель: 3745107148 [3,4 гб], ломая

Набор из них (кажется, даже с прерывателями, Elasticsearch все равно не хватает памяти):

И затем куча следующего, что, как я считаю, является попыткой поднять осколок реплики на другом узле (что затем приведет к сбою ЭТОГО узла и начнет цепную реакцию... Я избавился от этой ошибки с помощью устранение осколков реплик, но я бы предпочел лучшее решение)

[2015-10-06 08:38:35,707] [ПРЕДУПРЕЖДЕНИЕ] [action.bulk] [Эрик Слотер] Не удалось выполнить индексы: данные/запись/массовые [ы] на удаленной реплике [Tower][KxzEXAXKTCazjLzgOJE_aA][host005][ inet[/192.168.1.5:9300]]{master=false}[bro-2015-10-06][8] org.elasticsearch.transport.NodeDisconnectedException: [Tower][inet[/192.168.1.5:9300]][ индексы: данные/запись/объем [s][r]] отключены

Я понимаю, что одним из способов решения этой проблемы является горизонтальное масштабирование, но у меня нет такой роскоши, и я бы предпочел иметь возможность правильно использовать имеющийся у меня кластер (тем более, что я использую только 0,5 ТБ данных). и многое другое в наличии).

Я также исследовал несколько других вариантов, которые можно увидеть на моей карте ниже. Предполагается, что формат данных "doc_values" загружает данные поля на диск, но это не устраняет проблему полностью. Возможно, что-то еще съедает всю память, или виноваты мета-поля (_type, _id и т. д.) (поскольку я не нашел способа настроить их с «doc_values»). Я также использую глобальные порядковые номера для строковых полей.

Если кому-то нужна дополнительная информация о моем кластере или конфигурации, дайте мне знать! Я действительно в тупике, поэтому заранее спасибо за любую помощь, которую вы, ребята, можете предложить.

Вот шаблон сопоставления, который я использовал: http://pastebin.com/S8UVKRxZ

Вот мои конфиги elasticsearch.yml: http://pastebin.com/PaG0pBC5

Сколько записей у вас есть на индекс? Если количество записей на индекс исчисляется миллиардами, вы можете разбить свои индексы.


person Matt B    schedule 15.10.2015    source источник


Ответы (1)


^^ Я бы предпочел, чтобы это был комментарий, но из-за моей низкой репутации я не могу комментировать ваш вопрос.

Из документации ElasticSearch: limiting_memory_usage.

Вы можете удивиться, обнаружив, что Elasticsearch загружает в fielddata не только значения документов, соответствующих вашему запросу. Он загружает значения для всех документов в вашем индексе, даже для документов с другим _type!

Спасибо за ваш ответ! В настоящее время все записи хранятся в одном индексе. Я, конечно, могу попробовать разбить их на более мелкие, но из любопытства, почему это поможет? Я думаю, что большее количество индексов приведет к большему использованию памяти.

person rockstarartist    schedule 15.10.2015
comment
Пожалуйста, смотрите мой обновленный ответ. Возможно, запросы потребуют не ВСЕ данные из одного большого индекса, а только данные некоторых индексов, которые меньше, чем сумма всех данных, которые вы храните. - person Matt B; 16.10.2015
comment
Это действительно решило мои проблемы с памятью, и я больше не сталкиваюсь с ошибками нехватки памяти при загрузке панелей мониторинга! Спасибо. - person rockstarartist; 16.10.2015
comment
[2015-10-06 08:32:06,279][WARN ][netty.channel.socket.nio.AbstractNioSelector] Неожиданное исключение в цикле селектора. org.elasticsearch.index.engine.CreateFailedEngineException: [bro-2015-10-06][2] Ошибка создания для [dns#AVA9HeN5uS-hcepf0HbN] в org.elasticsearch.index.engine.InternalEngine.create(InternalEngine.java:262 ) в org.elasticsearch.index.shard.IndexShard.create(IndexShard.java:470) в org.elasticsearch.action.bulk.TransportShardBulkAction.shardIndexOperation(TransportShardBulkAction.java:437) в org.elasticsearch.action.bulk.TransportShardBulkAction. shardOperationOnPrimary(TransportShardBulkAction.java:149) в org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:515) в org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction$AsyncShard1OperationAction .java:422) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExec utor.java:1145) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:744) Причина: org.apache.lucene.store .AlreadyClosedException: отказ от удаления любых файлов: этот IndexWriter столкнулся с неисправимым исключением в org.apache.lucene.index.IndexFileDeleter.ensureOpen(IndexFileDeleter.java:354) в org.apache.lucene.index.IndexFileDeleter.deleteFile(IndexFileDeleter.java :719) по адресу org.apache.lucene.index.IndexFileDeleter.deleteNewFiles(IndexFileDeleter.java:712) по адресу org.apache.lucene.index.IndexWriter.deleteNewFiles(IndexWriter.java:4821) по адресу org.apache.lucene.index. DocumentsWriter$DeleteNewFilesEvent.process(DocumentsWriter.java:749) в org.apache.lucene.index.IndexWriter.processEvents(IndexWriter.java:4875) в org.apache.lucene.index.IndexWriter.processEvents(IndexWriter.java:4867) на org.apache.lucene.index.IndexWriter.update Документ(IndexWriter.java:1527) в org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1252) в org.elasticsearch.index.engine.InternalEngine.innerCreateNoLock(InternalEngine.java:343) в org.elasticsearch .index.engine.InternalEngine.innerCreate(InternalEngine.java:285) в org.elasticsearch.index.engine. InternalEngine.create(InternalEngine.java:256) ... еще 8 Вызвано: java.lang.OutOfMemoryError: пространство кучи Java - person Matt B; 03.12.2015