データ収集において、バッチ処理で embulk を利用されているケースは多いんじゃないかと思います。弊社でもログを日次で BigQuery に流したり、提携している金融機関様とのデータ連携時に利用してます。
その embulk を実行する際にデータロードの一連のフローをシェルで書いて実行していましたが、最近一部のバッチ処理で digdag で管理するようにしました。
結論、digdag よいよ。Jenkins(弊社の場合) とうまく使い分けできそう。
digdag
digdag は分散ワークフローエンジンです。ワークフローエンジンだとすでに存在しているものもいくつかありますが、それらは基本 GUI をベースとしています。
それに対して digdag はコードで定義します。つまり、git 管理、レビュー等が行えるってところがは既存にはないメリット。そもそも既存のワークフローエンジンではできないことを補うとために開発されてます。その開発背景からもわかるように、Jenkins から digdag に乗り換えるとかではない。
クーロンなどで定期実行しているスクリプトや embulk でのバッチ処理は積極的に digdag で定義することで、Jenkins の運用もかなり楽になるんじゃないかと思います。
.dig
ファイル
digdag は .dig
ファイルに実行タスクを記述していきます。
digdag init
で生成され、あとは必要なフローを記載していくだけ、楽。
$ digdag init sample
2016-12-14 09:46:32 +0900: Digdag v0.8.18
Creating sample/sample.dig
Creating sample/.gitignore
Done. Type `cd sample` and then `digdag run sample.dig` to run the workflow. Enjoy!
ワークフロー定義
先ほど生成された .dig
ファイルにフロー定義していきます。
その際、この3つのキーを覚えておけばある程度フローは組めます。
+
タスクを定義する際にこのキーを使います。
例えば ディレクトリ作って -> embulk でそこにファイルアウトプットして -> slack に通知 というフローを定義したいとき、それぞれのタスクを以下のように +
で定義。
timezone: UTC
+mkdir_tmp
+load
+notification
>
指定したアクションを実行します。(operators>)
+
で定義したそれぞれのタスクで足りたいことを追加していけばよいです。
ここではディレクトリ作って embulk 実行して、rb スクリプトを実行。
timezone: UTC
+mkdir_tmp
sh>: mkdir -p tmp
+load
embulk>: data/config.yml
_export:
rb:
require: "tasks/notifications"
+notification
rb>: Notifications.slack
_export
はフロー全体に対するパラメータを設定します。Ruby スクリプトを実行する際はここで require
が必要。
${ }
変数を埋め込むことができます。
先ほど出てきた _export
を使います。
${code}
で呼び出せます。
_export:
code: 123
配列で定義してループで処理することもできます。
timezone: UTC
+mkdir_tmp
sh>: mkdir -p tmp
_export:
targets: ["data1", "data2", "data3"]
+load
for_each>:
data: ${targets}
_do:
+execute:
embulk>: ${data}/config.yml
_export:
rb:
require: "tasks/notifications"
+notification
rb>: Notifications.slack
実行
digdag run sample.dig
まとめ
digdag さくっと試せますし、何より git 管理できるのはよいです。
普段業務をしていると、クーロン管理など結構煩雑になり属人化されていて、これ誰に聞けばよいんだろうってこともあるかと思います。スクリプト改修しようとしても実は手で更新する必要があったり。。
そういった属人化されているところに digdag を使うことで解決できる課題は多いと思う。
そして、これまで Jenkins でフローを組んでいてジョブの管理が辛くなってきたとか、digdag 使うことで整理できるケースもありそうですね。