【问题标题】:ElasticSearch, Logstash, MySQL: how do I speed up a large import?ElasticSearch、Logstash、MySQL:如何加快大型导入?
【发布时间】:2017-12-01 06:02:06
【问题描述】:

我正在尝试将一个大型(约 30M 行)MySQL 数据库导入 ElasticSearch。酷酷的,有一个logstash 工具看起来像是为这种事情而构建的;它的 JDBC 插件可以让我直接连接到数据库并快速读取行。

但是!当我尝试它时,它会用java.lang.OutOfMemoryError 轰炸。好的。它可能试图批处理太多行或其他东西。所以我将jdbc_fetch_size => 1000 添加到我的配置中。没有骰子,仍然没有记忆。好的,也许那个选项不起作用,或者没有按照我的想法做?

所以我尝试将jdbc_paging_enabled => truejdbc_page_size => 10000 添加到我的配置中。成功!它开始以 10k 的批次向我的索引添加行。

但它变慢了。起初我每分钟运行 100k 行;但是,当我达到 2M 行时,我可能只有十分之一。毫不奇怪;我很确定这是使用 LIMIT 和 OFFSET,并且在查询中使用巨大的 OFFSET 真的很慢,所以我在这里处理的是 O(n^2) 类型的事情。

我真的很想运行整个大查询并让光标遍历结果集,但看起来由于某种原因这不起作用。如果我对查询有更多控制权,我可以将 LIMIT/OFFSET 更改为 WHERE id BETWEEN val1 AND val2 之类的东西,但我看不出我可以在哪里执行此操作。

关于如何不崩溃但仍以合理速度运行的任何建议?

【问题讨论】:

    标签: mysql elasticsearch logstash full-text-indexing


    【解决方案1】:

    好的!在为“内存”搜索 logstash-input-jdbc github 页面的问题后,我找到了this revelation

    mysql 5.x 的连接字符串中好像需要增加一个参数?useCursorFetch=true

    事实证明,由于某种原因,默认情况下 MySQL JDBC 客户端不使用游标来获取行,并且 logstash 客户端不会警告您它无法使用游标来遍历结果集,即使由于其他原因,您设置了jdbc_fetch_size

    当然,了解这一点的明显方法是仔细阅读the MySQL Connector/J documentation,其中确实提到了默认情况下光标是关闭的,尽管没有说明原因。

    无论如何,我将useCursorFetch=true 添加到连接字符串中,将jdbc_query_paging 踢到路边,并在 2.5 小时内将 2600 万行导入到我的索引中,在具有 8G 内存的老化 Macbook Pro 上。

    感谢 github 用户 axhiao 提供有用的评论!

    【讨论】:

    • 亲爱的 Nate,我也面临类似的问题。你能分享你的 Logstash conf 文件吗,我试过了,但它根本不起作用。谢谢
    猜你喜欢
    • 2020-02-06
    • 2018-01-10
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2019-01-22
    • 2020-02-18
    相关资源
    最近更新 更多