Embulk の MySQL Output プラグインで大量のデータを転送するとエラーになる

Embulk の MySQL Output プラグイン

これです。「Output」という名前が紛らわしいのですが*1、INSERT をする方のプラグインです。

対象としたデータ

出力元は MySQL です*2。対象のテーブルのカラム数は 10、レコード数は約 776 万件です。

途中でエラー

ある程度までは進んでいくのですが、途中でコケます。エラーメッセージは以下のとおりです。

org.embulk.exec.PartialExecutionException: java.lang.RuntimeException: java.sql.SQLException: The total number of locks exceeds the lock table size

まあ、メモリ不足ですね*3

プラグインのオプション設定や MySQL のオプション設定をいじる

となると MySQL Output プラグインの設定をいじることだったり、MySQL の設定をいじることをやろうとしますが、まあたいてい少しの改善は見られても、だめだったりしますし、実際だめでした。

Embulk(やFluentdも)の用途を考えるとこういう利用方法はすべきではないでしょう。

どうするか

もちろん mysqldump なりを経由して初期のデータはインポートしてから Embulk で merge なりをしてあげれば全く問題ないです。Embulk だけで解決したい場合は、扱うデータを細切れにすればきっと大丈夫でしょう*4

今回はやや実験的なことをしたという認識がありましたが、やはりソフトウェアは想定された方法や場面で使うべきということですね。

*1:EmbulkからOutputする、という意味ですが私は結構混乱します

*2:つまり MySQL → MySQL という入出力です

*3:物理メモリ量を超えるデータでした

*4:しかしそれを Embulk でやる必要性は……

Powered by はてなブログ