Embulk でレジューム(差分実行)するためには実行時に -o オプションを付ける

Embulk

ご存知Embulkhttp://www.embulk.org/)ですが、Fluentdhttp://www.fluentd.org/)とともにとても便利なプロダクトですよね。データベースの実質的なレプリケーションもこれで柔軟に行えたりします。プラグインにもよりますが、オプション指定も豊富にできて、様々な形で必要なデータを扱えます。

Embulk でレジューム実行する

MySQL の Input plugin に実装されている*1機能として、それまでに読み出した場所を記憶してくれて、次回以降はその続きから読んでくれるといういわゆるレジューム機能があります*2

MySQL の Input plugin ではこの機能を有効にするためにincrementaltrueにしてあげればいいです。……が、いくらこの設定をしても、毎回毎回最初から読み出してしまいます。数十万単位のレコードなら良いですが、数百万単位以上のレコードになるとこれはとてもツラいです。

きっとどこか設定が間違っているんだろうなと思って調べていたところ、救世主となる記事を見つけました。

結論から言えば、Embulk の実行時に -o(--output)オプションを指定する必要があります。このオプションを指定すると、Embulk の実行が終わった際に、指定の場所に次回実行に用いることができる.ymlファイルが生成されます。

この.ymlファイルの中にはレジュームに必要となるlast_recordというキーがちゃんと記録されています。次回に Embulk を実行するときにこのファイルを設定ファイルとして指定してあげれば無事レジュームしてくれるということです。

-r(--resume-state)オプションもあり

GitHub のドキュメントにあるのでこちらは有名かと思いますが、-r(--resume-state)オプションを用いればトランザクションに失敗した際のレジュームファイルが生成されます。こちらも指定してあげれば取得漏れがあった際に役立つことでしょう。

追記

実行ログを見ていたら、思いっ切り-oオプションはdeprecatedでした。代わりに-cを使いましょうとのことです……が-cだとlast_recordしか記録されない.ymlが出てくるような……。

*1:他のプラグインももちろんあると思われます

*2:トランザクションが失敗した際のレジュームとは異なります

Powered by はてなブログ