【发布时间】:2017-12-01 06:02:06
【问题描述】:
我正在尝试将一个大型(约 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 之类的东西,但我看不出我可以在哪里执行此操作。
关于如何不崩溃但仍以合理速度运行的任何建议?
【问题讨论】:
标签: mysql elasticsearch logstash full-text-indexing