【发布时间】:2018-08-12 06:13:38
【问题描述】:
我正在尝试将大约 700 万个文档上传到 ES 6.3,并且我遇到了批量上传速度慢到爬行大约 100 万个文档的问题(我在索引中没有此之前的文档) .
我有一个 16GB 的 3 节点 ES 设置,8GB JVM 设置,1 个索引,5 个分片。 我已关闭刷新(“-1”),将副本设置为 0,将索引缓冲区大小增加到 30%。
在我的上传方面,我有 22 个线程,每个批量插入请求运行 150 个文档。这只是一个使用 Postgresql、ActiveRecord、Net/HTTP(用于网络调用)和使用 ES Bulk API(无 gem)的基本 ruby 脚本。
对于我的所有节点和上传机器,CPU、内存、SSD 磁盘 IO 都很低。
我已经能够获得大约每分钟 30k-40k 的插入,但这对我来说似乎真的很慢,因为其他人已经能够做到每秒 2k-3k。我的文档确实有嵌套的 json,但它们对我来说似乎不是很大(有没有办法检查单个大小的文档或平均值?)。
我希望能够在 12 到 24 小时内批量上传这些文档,看起来 ES 应该可以处理,但是一旦达到 100 万,它似乎就会慢下来。
我对 ES 还很陌生,因此我们将不胜感激。我知道这似乎是已经被问过的问题,但我已经尝试了几乎所有我能找到的东西,并且想知道为什么我的上传速度会变慢。
我还检查了日志,只看到一些关于映射字段无法更改的错误,但没有关于内存溢出或类似情况的错误。
ES 6.3 很棒,但我也发现 API 已更改为 6,并且不再支持人们使用的设置。
我认为我在与原始数据库的活动连接处发现了一个瓶颈,并增加了连接池,这有所帮助,但在大约 100 万条记录时仍然缓慢爬行,但在大约 8 小时的运行后达到了 200 万条记录。
p>我还在一台大机器上做了一个实验,用来运行上传作业,运行 80 个线程,每个线程上传 1000 个文档。我做了一些计算,发现我的文档每个文档大约 7-10k,因此每个批量索引上传 7-10MB。这使文档数量更快地达到 1M,但是一旦到达那里,一切都会变慢。机器统计数据仍然很低。我确实每隔 5 分钟左右在作业的日志上看到线程的输出,大约在同一时间看到 ES 计数发生变化。
ES 机器的 CPU 和内存仍然很低。 IO 约为 3.85MB,网络带宽为 55MB,然后降至 20MB 左右。
任何帮助将不胜感激。不确定我是否应该尝试 ES gem,并使用可能保持连接打开的批量插入,或者尝试完全不同的插入。
【问题讨论】:
-
我忘了提到除了索引更改之外,ES 安装来自 apt-get es repo。除了将 ES 置于生产模式所需的步骤(运行 ES 网站清单)之外,我还没有真正进行任何自定义更改。
-
原始文档在哪个数据库中?
-
文档原本在 Postgresql 中。我已经开始分析该数据库,并注意到一旦您使用大约 100 万的偏移量,查询就会开始花费很长时间。我有多个索引,但我猜我需要一个这个特定的查询,或者升级数据库硬件。
标签: ruby multithreading elasticsearch activerecord bulkinsert