弹性搜索无法写入所有条目:可能是es重载

时间:2018-03-20 06:36:58

标签: apache-spark elasticsearch apache-spark-sql elasticsearch-spark

我有一个应用程序,我在其中读取csv文件并进行一些转换,然后将它们从spark本身推送到弹性搜索。喜欢这个

input.write.format("org.elasticsearch.spark.sql")
              .mode(SaveMode.Append)
              .option("es.resource", "{date}/" + type).save()

我有几个节点,在每个节点中,我运行5-6 spark-submit个命令,推送到elasticsearch

我经常收到错误

Could not write all entries [13/128] (Maybe ES was overloaded?). Error sample (first [5] error messages):
        rejected execution of org.elasticsearch.transport.TransportService$7@32e6f8f8 on EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@4448a084[Running, pool size = 4, active threads = 4, queued tasks = 200, completed tasks = 451515]]

我的Elasticsearch集群有以下统计信息 -

Nodes - 9 (1TB space,
Ram >= 15GB ) More than 8 cores per node

我修改了elasticseach的以下参数

spark.es.batch.size.bytes=5000000
spark.es.batch.size.entries=5000
spark.es.batch.write.refresh=false

有人可以建议,我可以解决哪些问题来摆脱这些错误?

2 个答案:

答案 0 :(得分:2)

发生这种情况是因为批量请求的传入速率大于elasticsearch集群可以处理的并且批量请求队列已满。

默认批量队列大小为200。

您应该在客户端进行理想的处理:

1)通过减少并发运行的spark-submit命令的数量

2)通过调整es.batch.write.retry.count和{}来重试拒绝 es.batch.write.retry.wait

实施例: es.batch.write.retry.wait = 6 es.batch.write.retry.count = "60s"

在弹性搜索集群方面:

1)检查每个索引是否有太多分片并尝试减少它 这个blog对调整分片数量的标准进行了很好的讨论。

2)作为最后的手段增加thread_pool.index.bulk.queue_size

通过对批量拒绝的广泛讨论,检查此blog

答案 1 :(得分:0)

ES群集中​​的批量队列正在达到其容量(200)。尝试增加它。有关如何更改批量队列容量的信息,请参阅此页面。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html

另外检查另一个SO答案,其中OP有一个非常类似的问题,并通过增加批量池大小来修复。

Rejected Execution of org.elasticsearch.transport.TransportService Error