弹性搜索无法写入所有条目:可能是 es 超载了
Elastic search could not write all entries: May be es was overloaded
我有一个应用程序,我可以在其中读取 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@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
任何人都可以建议,我可以修复什么来消除这些错误?
您的 ES 集群中的批量队列已达到其容量 (200)。尝试增加它。有关如何更改批量队列容量的信息,请参阅此页面。
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html
另请检查其他 SO 答案,其中 OP 有一个非常相似的问题,并通过增加批量池大小得到解决。
发生这种情况是因为批量请求传入的速度大于 elasticsearch 集群可以处理的速度,并且批量请求队列已满。
默认批量队列大小为 200。
你应该在客户端处理这个问题:
1) 通过减少 spark-submit 同时命令 运行 的数量
2) 通过调整 es.batch.write.retry.count
和
es.batch.write.retry.wait
示例:
es.batch.write.retry.wait = "60s"
es.batch.write.retry.count = 6
在 elasticsearch 集群端:
1) 检查每个索引是否有太多分片并尝试减少它。
blog 对调整分片数量的标准进行了很好的讨论。
2) 作为最后的手段增加 thread_pool.index.bulk.queue_size
查看此 blog,其中包含关于批量拒绝的广泛讨论。
我有一个应用程序,我可以在其中读取 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@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
任何人都可以建议,我可以修复什么来消除这些错误?
您的 ES 集群中的批量队列已达到其容量 (200)。尝试增加它。有关如何更改批量队列容量的信息,请参阅此页面。
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html
另请检查其他 SO 答案,其中 OP 有一个非常相似的问题,并通过增加批量池大小得到解决。
发生这种情况是因为批量请求传入的速度大于 elasticsearch 集群可以处理的速度,并且批量请求队列已满。
默认批量队列大小为 200。
你应该在客户端处理这个问题:
1) 通过减少 spark-submit 同时命令 运行 的数量
2) 通过调整 es.batch.write.retry.count
和
es.batch.write.retry.wait
示例:
es.batch.write.retry.wait = "60s"
es.batch.write.retry.count = 6
在 elasticsearch 集群端:
1) 检查每个索引是否有太多分片并尝试减少它。
blog 对调整分片数量的标准进行了很好的讨论。
2) 作为最后的手段增加 thread_pool.index.bulk.queue_size
查看此 blog,其中包含关于批量拒绝的广泛讨论。