最初的ElasticSearch批量索引/插入/上传速度真的很慢,如何提高速度?

时间:2018-08-11 14:56:19

标签: ruby multithreading elasticsearch activerecord bulkinsert

我正尝试将大约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的插入,但是这对我来说似乎太慢了,因为其他人已经可以每秒2k至3k的插入速度。我的文档确实有嵌套的json,但对我来说似乎并不大(是否可以查看单个文档大小或平均大小?)。

我希望能够在不到12-24小时的时间内批量上传这些文档,并且看来ES应该可以处理这些文件,但是一旦达到一百万,它的爬网速度似乎就会变慢。

我对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,并使用可能保持连接打开的大容量插入,或尝试完全不同的插入方式。

1 个答案:

答案 0 :(得分:1)

  

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

您能举例说明在6.0和6.3之间发生的重大变化吗?我们实际上是在努力避免这些情况,而且我真的无法从脑海中回想起任何事情。

  

我已经开始对该数据库进行性能分析,并注意到一旦使用偏移量大约为100万,查询将开始花费很长时间。

深度分页是很糟糕的表现。有很棒的博客文章no-offset,其中解释了

  • 为什么不好:要获得1,000至1,010的结果,您需要对前1,010条记录进行排序,扔掉1,000条记录,然后发送10条记录。分页越深,它的成本就越高。
  • 如何避免这种情况:对您的条目进行唯一的排序(例如,按ID或按日期和ID组合,但这是绝对的),并在何处开始添加条件。例如,按ID排序,获取前10个条目,并为下一次迭代保留第10个条目的ID。以该ID的顺序重新排序,但条件是该ID必须大于上一次运行中的最后一个ID,然后获取接下来的10个条目,并再次记住最后一个ID。重复直到完成。

通常,使用您的设置,插入超过100万条记录确实没有问题。我将研究首先要获取数据的部分。