我正在尝试使用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
答案 0 :(得分:0)
每个索引有多少条记录?如果每个索引的记录数量达到数十亿,那么您可能希望将索引分解。
^^我希望这是一个评论,但由于我的声誉很低,我无法对你的问题发表评论。
来自ElasticSearch的文档: limiting_memory_usage
您可能会惊讶地发现Elasticsearch无法加载 fielddata只是与您的查询匹配的文档的值。它 加载索引中所有文档的值,甚至是带有的文档 一个不同的_type!