2

我正在尝试将 100 万条记录同步到 ES,并且我正在使用批量 API 批量 2k 进行同步。但是在插入大约 25k-32k 之后,弹性搜索给出了以下异常。

Unable to parse response body: org.elasticsearch.ElasticsearchStatusException
ElasticsearchStatusException[Unable to parse response body]; nested: ResponseException[method [POST], host [**********], URI [/_bulk?timeout=1m], status line [HTTP/1.1 403 Request throttled due to too many requests]
403 Request throttled due to too many requests /_bulk]; nested: ResponseException[method [POST], host [************], URI [/_bulk?timeout=1m], status line [HTTP/1.1 403 Request throttled due to too many requests]
403 Request throttled due to too many requests /_bulk];

我正在使用 aws 弹性搜索。我认为,我需要实施等待策略来处理它,例如继续检查 es 状态并在 ES 的所有状态都正常的情况下调用批量插入。 但不确定如何实施?ES 是否为它提供任何预构建? 或者有什么更好的方法来处理这个?

提前致谢。

更新:我正在使用 AWS 弹性搜索 6.8 版

4

2 回答 2

1

感谢@dravit 在评论中包含我之前的 SO 答案,在关注评论之后,似乎 OP 想要提高批量索引的性能并想要指数退避,我不认为 Elasticsearch 提供了开箱即用的功能。

我看到您在每秒后暂停 1 秒,这在所有情况下都不起作用,如果您有大量的批次和文档要编入索引,那么肯定会花费很多时间。我这边还有一些改进性能的建议。

  1. 按照我的提示来提高Elasticsearch 中的重新索引速度,看看这里列出的所有内容都适用,并通过什么因素来提高速度。
  2. 找到一个最适合您的环境的批处理策略,我不确定,但这篇来自@spinscale 的文章可能会有所帮助,他是 Java 高级别的客户端开发人员,或者您可以在https://discuss.elastic.co/上提问,我记得他在他的一个网络研讨会上分享了一个非常好的批处理策略,但找不到它的链接。
  3. 注意除了批量线程池和队列大小之外的各种 ES 指标,看看你的 ES 是否还有容量,你可以增加队列大小并提高向 ES 发送请求的速率。
于 2021-02-26T09:02:35.900 回答
-2

在此处查看错误处理指南

如果由于请求过多或 429 Too Many Requests 错误而收到持续的 403 请求限制,请考虑垂直扩展。如果负载会导致内存使用量超过 Java 堆的最大大小,Amazon Elasticsearch Service 会限制请求。

垂直扩展您的应用程序或增加请求之间的延迟。

于 2021-02-22T12:32:05.457 回答