如何解决 Amazon Elasticsearch Service 中的 429 错误“es_rejected_execution_exception”?

上次更新日期:2020 年 10 月 16 日

当我将数据写入 Amazon Elasticsearch Service (Amazon ES) 集群时,请求被拒绝。我收到与以下类似的 ThreadpoolBulkRejected 错误消息:

error":"elastic: Error 429 (Too Many Requests): rejected execution of org.elasticsearch.transport.TransportService$7@b25fff4 on 
EsThreadPoolExecutor[bulk, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@768d4a66[Running, 
pool size = 2, active threads = 2, queued tasks = 200, completed tasks = 820898]] [type=es_rejected_execution_exception]"

注意:不同版本的 Amazon ES 使用不同的线程池来处理对 _index API 的调用。Elasticsearch 1.5 和 2.3 版使用索引线程池。Elasticsearch 5.x、6.0 和 6.2 版使用批量线程池。Elasticsearch 6.3 版及更高版本使用写线程池。

简短描述

es_rejected_execution_exception[bulk] 是批量队列错误。当对 Elasticsearch 集群的请求数超过批量队列大小 (threadpool.bulk.queue_size) 时,会发生此问题。每个节点上的批量队列可以容纳 50 到 200 个请求,具体取决于您使用的 Elasticsearch 版本。队列已满时,将拒绝新请求。

es_rejected_execution_exception[write]ThreadpoolWriteQueue 错误。当 Elasticsearch 集群的请求数量超过 _index 队列大小 threadpool.write.queue_size 时,将发生 es_rejected_execution_exception[write]。每个节点上的 ThreadpoolWriteQueue 可以容纳 50 到 200 个请求,具体取决于您使用的 Elasticsearch 版本。队列已满时,将拒绝新请求。

解决方法

注意:在大多数 Amazon ES 版本中,批量队列大小无法增加。该队列存在的原因是它将请求限制为可管理的数量。有关更多信息,请参阅 Elasticsearch 文档中的“线程池”部分

使用以下方法之一解决 es_rejected_execution_exception 错误:

  • 添加更多节点:每个节点都有一个写队列,因此添加更多节点可以为您提供更多的排队容量。要添加节点,请参阅配置 Amazon ES 域
    注意:请确保您有足够的活跃索引分区可分配到新节点。否则,添加节点不会提升排队容量。“活跃索引分区”是在最近五分钟内收到过至少一个索引请求的分区。
  • 切换到更大的实例类型:对于写请求,每个节点上线程池中的线程数等于可用处理器的数量。切换到具有更多虚拟 CPU (vCPU) 的实例将获得更多线程来处理 _index 请求。有关更多信息,请参阅选择实例类型和测试
  • 改善索引性能:当文档生成索引速度更快时,写队列的容量不太可能用尽。有关性能调整的更多信息,请参阅如何提高我的 Elasticsearch 集群上的索引性能?

这篇文章对您有帮助吗?


您是否需要账单或技术支持?