我一直在尝试设置一个elasticsearch集群来处理来自某些3D打印机的一些日志数据。 我们每天为20台机器生成超过850K的文档。他们每个人都有自己的索引。
现在我们拥有16个月的数据,并在每个弹性搜索索引中记录大约410M的记录。 我们正在处理带有spark的CSV文件中的数据并写入一个有3台机器的elasticsearch集群,每台机器都有16GB的RAM和16个CPU内核。 但是每当我们达到大约10-14M doc / index时,我们就会遇到网络错误。
Job aborted due to stage failure: Task 173 in stage 9.0 failed 4 times, most recent failure: Lost task 173.3 in stage 9.0 (TID 17160, wn21-xxxxxxx.ax.internal.cloudapp.net, executor 3): org.elasticsearch.hadoop.rest.EsHadoopNoNodesLeftException: Connection error (check network and/or proxy settings)- all nodes failed; tried [[X.X.X.X:9200]]
我确定这不是网络错误,只是elasticsearch无法处理更多的索引请求。
为了解决这个问题,我尝试调整了许多弹性搜索参数,例如:refresh_interval
来加速索引并摆脱错误但没有任何效果。在监控集群之后,我们认为我们应该扩展它。
我们也尝试调整elasticsearch spark连接器但没有结果。
所以我正在寻找一种选择群集大小的正确方法?有关如何选择群集大小的指南吗?任何亮点都会有所帮助。
注意:我们主要对索引数据感兴趣,因为我们只有一个或两个查询来运行数据以获得一些指标。
答案 0 :(得分:2)
我首先尝试按月(甚至每天)拆分索引,然后搜索索引模式。示例:sensor_data_2018.01,sensor_data_2018.02,sensor_data_2018.03等。并使用sensor_data的索引模式进行搜索_ *
会影响您需要的群集大小的一些事情将是:
我认为您的群集应该足以处理大量数据。我们有一个集群有3个节点(每个8CPU / 61GB RAM),〜670个索引,~30亿个文档,〜3TB数据,并且当索引速率超过30,000个文档/秒时只有索引问题。即使这样,只有少量文档的索引会失败,并且可以在短暂的延迟后成功重试。我们的实现也非常重要,只需极少的实际搜索。
我会查看弹性搜索服务器日志,看看是否可以找到更详细的错误消息。可能会查找RejectedExecutionException' s。当您开始收到可能会对发生的事情有所了解的故障时,请检查cluster health和node stats。如果可能的话,在故障开始时实施重试和退避,以便给ES时间赶上负载。
希望有所帮助!
答案 1 :(得分:0)
这是网络错误,说数据节点已丢失。也许是崩溃,您可以查看elasticsearch日志以查看最新情况。
使用elasticsearch4Hadoop了解最重要的事情是如何并行化工作:
重要的是分片,这是使用elasticsearch对作品进行负载均衡的方法。此外,refresh_interval
必须是> 30 secondes,并且,你应该在索引时禁用复制,这是非常基本的配置调优,我相信你可以在文档上找到很多关于它的建议。
使用Spark,您可以检查Web UI(端口4040)如何将工作拆分为任务和分区,这对此有很大帮助。此外,您还可以监控Spark和ES之间的网络带宽以及es节点统计信息。