Initial ElasticSearch Bulk Index/Insert /上传真的很慢,如何提高速度?

Initial ElasticSearch Bulk Index/Insert /Upload is really slow, How do I increase the speed?

我正在尝试将大约 700 万个文档上传到 ES 6.3,我一直在 运行 解决批量上传速度减慢到大约 100 万个文档(我没有文档)的问题在索引之前。

我有一个 3 节点 ES 设置,16GB,8GB JVM 设置,1 个索引,5 个分片。 我已关闭刷新(“-1”),将副本设置为 0,将索引缓冲区大小增加到 30%。

在我的上传端,每个批量插入请求有 22 个线程 运行宁 150 个文档。这只是一个使用 Postgresql、ActiveRecord、Net/HTTP(用于网络调用)和使用 ES Bulk API(没有 gem)的基本 ruby 脚本。

对于我的所有节点和上传机器,CPU、内存、SSD 磁盘 IO 都很低。

我已经能够插入大约 30k-40k per/minute,但这对我来说似乎真的很慢,因为其他人已经能够插入 2k-3k per/sec。我的文档确实有嵌套 json,但它们对我来说似乎不是很大(有没有办法检查单个大小的文档或平均值?)。

我希望能够在 12 到 24 小时内批量上传这些文档,似乎 ES 应该可以处理,但是一旦我达到 100 万,它似乎就会变慢。

我是 ES 的新手,所以任何帮助将不胜感激。我知道这似乎是一个已经被问过的问题,但我已经尝试了几乎所有我能找到的东西,想知道为什么我的上传速度慢了一个因素。

我也查看了日志,只看到一些关于映射字段无法更改的错误,但没有关于内存溢出之类的错误。

ES 6.3 很棒,但我还发现 API 已将一堆更改为 6,不再支持人们使用的设置。

我认为我在与原始数据库的活动连接处发现了瓶颈并增加了连接池,这有所帮助,但在大约 100 万条记录时仍然缓慢爬行,但在大约 8 小时内达到了 200 万条 运行宁.


我还在一台大型机器上尝试了一个实验,该机器用于 运行 上传作业,运行在每个 1000 个文档上传时使用 80 个线程。我做了一些计算,发现我的文档每个文档大约 7-10k,因此每个批量索引上传 7-10MB。这使文档计数更快地达到 1M,但是一旦到达那里,一切都会变慢。机器统计数据仍然很低。我确实每 5 分钟左右在作业日志中看到线程的输出,大约在同一时间我看到 ES 计数发生变化。

ES 机器的内存仍然不足 CPU。 IO 约为 3.85MB,网络带宽为 55MB,下降至约 20MB。

如有任何帮助,我们将不胜感激。不确定我是否应该尝试 ES gem,并使用可能保持连接打开的批量插入,或者尝试完全不同的东西来插入。

ES 6.3 is great, but I'm also finding that the API has changed a bunch to 6 and settings that people were using are no longer supported.

您能否举例说明 6.0 和 6.3 之间的重大更改对您来说是个问题?我们确实在努力避免这些,但我真的想不起来任何事情。

I've started profiling that DB and noticed that once you use offset of about 1 Million the queries are starting to take a long time.

深度分页在性能方面很糟糕。有很棒的博客 post no-offset,它解释了

  • 为什么不好:要获得 1,000 到 1,010 的结果,您需要对前 1,010 条记录进行排序,丢弃 1,000 条,然后发送 10 条。分页越深,成本越高
  • 如何避免:对您的条目进行唯一排序(例如按 ID 或组合日期和 ID,但必须是绝对的)并添加关于从哪里开始的条件。例如按 ID 排序,获取前 10 个条目,并为下一次迭代保留第 10 个条目的 ID。在那个订单中再次按 ID,但条件是 ID 必须大于您之前 运行 中的最后一个,并获取接下来的 10 个条目并再次记住最后一个 ID。重复直到完成。

一般来说,根据您的设置,插入超过 100 万条记录应该没有问题。我会先查看获取数据的部分。