如何防止Elasticsearch使用如此多的内存?

时间:2015-10-15 20:49:54

标签: elasticsearch kibana

我正在尝试使用Kibana来显示我已经摄入Elasticsearch的一些Bro记录。我已经加载了大约1个月的记录(大约30亿条记录在一起,大约4TB)。数据被摄取和索引没有问题。我可以在Kibana中构建一些简单的可视化,但是当我尝试加载我创建的仪表板(包括12个不同的可视化,并启动至少那么多Elasticsearch查询)时,我开始收到错误。

我正在运行一个包含5个数据节点的7节点Elasticsearch集群:

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] [WARN] [indices.breaker] [Eric Slaughter] [FIELDDATA]来自字段[AA]的新使用的内存3752926600 [3.4gb]将大于配置的断路器: 3745107148 [3.4gb],打破

这些的集合(看起来即使是断路器,Elasticsearch仍然会耗尽内存):

  

[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]创建失败           at org.elasticsearch.index.engine.InternalEngine.create(InternalEngine.java:262)           在org.elasticsearch.index.shard.IndexShard.create(IndexShard.java:470)           at org.elasticsearch.action.bulk.TransportShardBulkAction.shardIndexOperation(TransportShardBulkAction.java:437)           at org.elasticsearch.action.bulk.TransportShardBulkAction.shardOperationOnPrimary(TransportShardBulkAction.java:149)           at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction $ AsyncShardOperationAction.performOnPrimary(TransportShardReplicationOperationAction.java:515)           at org.elasticsearch.action.support.replication.TransportShardReplicationOperationAction $ AsyncShardOperationAction $ 1.run(TransportShardReplicationOperationAction.java:422)           在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)           at 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)           at org.apache.lucene.index.DocumentsWriter $ DeleteNewFilesEvent.process(DocumentsWriter.java:749)           在org.apache.lucene.index.IndexWriter.processEvents(IndexWriter.java:4875)           at org.apache.lucene.index.IndexWriter.processEvents(IndexWriter.java:4867)           在org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:1527)           at org.apache.lucene.index.IndexWriter.addDocument(IndexWriter.java:1252)           at org.elasticsearch.index.engine.InternalEngine.innerCreateNoLock(InternalEngine.java:343)           at org.elasticsearch.index.engine.InternalEngine.innerCreate(InternalEngine.java:285)           在org.elasticsearch.index.engine.InternalEngine.create(InternalEngine.java:256)           ......还有8个   引起:java.lang.OutOfMemoryError:Java堆空间

然后是一堆以下内容,我相信这是尝试在另一个节点上创建一个副本分片(这将导致该节点失败,并开始连锁反应......我已经得到了通过消除副本分片来摆脱这个错误,但我更喜欢更好的解决方案)

  

[2015-10-06 08:38:35,707] [警告] [action.bulk] [Eric Slaughter]无法执行索引:远程副本上的data / write / bulk [s] [Tower] [KxzEXAXKTCazjLzgOJE_aA] [ host005] [INET [/192.168.1.5:9300]] {主= FALSE} [BRO-2015年10月6日] [8]   org.elasticsearch.transport.NodeDisconnectedException:[Tower] [inet [/192.168.1.5:9300]] [indices:data / write / bulk [s] [r]]已断开连接

我知道解决这个问题的一种方法是横向扩展,但我没有这么奢侈,我宁愿能够正确使用我拥有的集群(特别是因为我只有使用0.5TB的数据,还有更多可用的数据。)

我还研究了一些其他选项,可以在下面的地图中看到。 " doc_values"数据格式应该在磁盘上加载字段数据,但并不能完全消除这个问题。可能有其他东西占用了所有内存,或者元字段(_type,_id等)应该受到责备(因为我还没有找到一种方法来配置那些&#34 ; doc_values&#34)。我也在使用字符串字段的全局序数。

如果有人需要有关我的群集或配置的更多信息,请告诉我们!我真的很难过,所以提前感谢你们提供的任何帮助。

以下是我使用的映射模板:http://pastebin.com/S8UVKRxZ

这是我的elasticsearch.yml配置:http://pastebin.com/PaG0pBC5

1 个答案:

答案 0 :(得分:0)

每个索引有多少条记录?如果每个索引的记录数量达到数十亿,那么您可能希望将索引分解。

^^我希望这是一个评论,但由于我的声誉很低,我无法对你的问题发表评论。

来自ElasticSearch的文档: limiting_memory_usage

  

您可能会惊讶地发现Elasticsearch无法加载   fielddata只是与您的查询匹配的文档的值。它   加载索引中所有文档的值,甚至是带有的文档   一个不同的_type!