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 万条记录应该没有问题。我会先查看获取数据的部分。
我正在尝试将大约 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 万条记录应该没有问题。我会先查看获取数据的部分。