大きな(〜30M行)MySQLデータベースをElasticSearchにインポートしようとしています。クールなクールな、logstash
ツールは、このようなもののために構築されているようです。そのJDBCプラグインを使用すると、データベースに正しく接続し、行を本当に速くスラップさせることができます。ElasticSearch、Logstash、MySQL:大きなインポートを高速化するにはどうすればよいですか?
ただし、私が試してみると、java.lang.OutOfMemoryError
で爆撃されます。はい。それはおそらくあまりにも多くの行や何かをバッチアップしようとしています。だから、自分の設定にjdbc_fetch_size => 1000
を追加します。サイコロはまだありません。さて、そのオプションがうまくいかない、あるいは私が思うことをしないかもしれない?
私はjdbc_paging_enabled => true
とjdbc_page_size => 10000
を私の設定に追加しようとしています。成功!私のインデックスに10kバッチの行を追加し始めます。
しかし、それは遅くなります。最初は100k行/分を実行しています。私が2M行にいる時までには、おそらく私はその10分の1です。そして驚きはありません。私はこれがLIMITとOFFSETを使用していると確信しています。そして、巨大なOFFSETを使用するのは本当に遅いので、ここではO(n^2)種類のものを扱っています。
大きなクエリ全体を実行し、カーソルが結果セットに対して反復処理するのは本当に好きですが、何らかの理由で機能していないようです。クエリをより詳細に制御できる場合は、WHERE id BETWEEN val1 AND val2
のLIMIT/OFFSETを変更することができますが、どこに入ることができるのか分かりません。
どのように私はクラッシュすることはできませんが、まだ妥当な速度で実行するための任意の提案?