ElasticSearch,Logstash,MySQL:如何加速大量导入?

Nat*_*ate 1 mysql full-text-indexing elasticsearch logstash

我正在尝试将大型(~30M行)MySQL数据库导入ElasticSearch.酷酷的,有一个logstash看起来像是为这类东西而建的工具; 它的JDBC插件可以让我连接到数据库,并快速实现行.

然而!当我尝试它时,它会爆炸java.lang.OutOfMemoryError.好的.它可能试图批量过多行或其他东西.所以我添加jdbc_fetch_size => 1000到我的配置.没有骰子,仍然没有记忆.好吧,也许这个选项不起作用,或者没有按照我的想法行事?

所以我尝试添加jdbc_paging_enabled => true和jdbc_page_size => 10000我的配置.成功!它开始以10k的批量向我的索引添加行.

但它放慢了速度.起初我跑100k行/分钟; 然而,当我在2M行时,我可能只有十分之一.并不奇怪; 我很确定这是使用LIMIT和OFFSET,并且在查询中使用大量OFFSET非常慢,所以我在这里处理O(n ^ 2)类的事情.

我真的很想只运行整个大查询并让游标迭代结果集,但看起来它因某些原因无效.如果我对查询有更多的控制权,我可以将LIMIT/OFFSET的东西更改为WHERE id BETWEEN val1 AND val2某种东西,但我无法看到我可以在哪里做到这一点.

关于我怎么不能崩溃,但仍以合理的速度运行的任何建议?

Nat*_*ate 5

好的!在为"Memory"搜索logstash-input-jdbc github页面的问题后,我发现了这个启示:

似乎需要将另一个参数?useCursorFetch=true添加到mysql 5.x的连接字符串中.

事实证明,由于某些原因,MySQL JDBC客户端默认不使用游标来获取行,并且logstash客户端不会警告您即使您已经无法使用游标迭代结果集设置一个jdbc_fetch_size因为其他原因.

当然,了解这一点的显而易见的方法就是仔细阅读MySQL Connector/J文档,它确实提到游标默认是关闭的,但不是原因.

无论如何,我添加useCursorFetch=true到连接字符串,踢到jdbc_query_paging路边,并在2.5小时内导入26M行到我的索引,在老化的Macbook Pro 8G内存.

感谢github用户axhiao的帮助评论!