2017-06-28 27 views
1

大きな(〜30M行)MySQLデータベースをElasticSearchにインポートしようとしています。クールなクールな、logstashツールは、このようなもののために構築されているようです。そのJDBCプラグインを使用すると、データベースに正しく接続し、行を本当に速くスラップさせることができます。ElasticSearch、Logstash、MySQL:大きなインポートを高速化するにはどうすればよいですか?

ただし、私が試してみると、java.lang.OutOfMemoryErrorで爆撃されます。はい。それはおそらくあまりにも多くの行や何かをバッチアップしようとしています。だから、自分の設定にjdbc_fetch_size => 1000を追加します。サイコロはまだありません。さて、そのオプションがうまくいかない、あるいは私が思うことをしないかもしれない?

私はjdbc_paging_enabled => truejdbc_page_size => 10000を私の設定に追加しようとしています。成功!私のインデックスに10kバッチの行を追加し始めます。

しかし、それは遅くなります。最初は100k行/分を実行しています。私が2M行にいる時までには、おそらく私はその10分の1です。そして驚きはありません。私はこれがLIMITとOFFSETを使用していると確信しています。そして、巨大なOFFSETを使用するのは本当に遅いので、ここではO(n^2)種類のものを扱っています。

大きなクエリ全体を実行し、カーソルが結果セットに対して反復処理するのは本当に好きですが、何らかの理由で機能していないようです。クエリをより詳細に制御できる場合は、WHERE id BETWEEN val1 AND val2のLIMIT/OFFSETを変更することができますが、どこに入ることができるのか分かりません。

どのように私はクラッシュすることはできませんが、まだ妥当な速度で実行するための任意の提案?

答えて

1

大丈夫です! 「メモリ」のlogstash入力-JDBC githubのページの問題を検索した後、私はthis revelationが見つかりました:

追加のパラメータ?useCursorFetch=trueは、MySQL 5.xのの接続文字列に追加する必要があると思われます

MySQL JDBCクライアントは何らかの理由でデフォルトで行をフェッチするためにカーソルを使用せず、logstashクライアントはカーソルを使用して他の理由でjdbc_fetch_sizeを設定していても結果は得られません。

もちろん、このことを知る明白な方法は、慎重にthe MySQL Connector/J documentationを読んで、カーソルがデフォルトでオフになっていると言いますが、なぜそうはしません。

はとにかく、私は縁石にjdbc_query_pagingを蹴った、と8Gメモリと高齢化のMacBook Proには、2.5時間で、私のインデックスに26Mの行をインポートし、接続文字列にuseCursorFetch=trueを追加しました。

githubユーザーaxhiaoさんのおかげで有益なコメントをいただきありがとうございます。

関連する問題