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某种东西,但我无法看到我可以在哪里做到这一点.
关于我怎么不能崩溃,但仍以合理的速度运行的任何建议?
好的!在为"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的帮助评论!
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |