digdag

digdag と Jenkins は共存共栄

More than 1 year has passed since last update.

データ収集において、バッチ処理で 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 に通知 というフローを定義したいとき、それぞれのタスクを以下のように + で定義。


sample.dig

timezone: UTC

+mkdir_tmp

+load

+notification



>

指定したアクションを実行します。(operators>

+ で定義したそれぞれのタスクで足りたいことを追加していけばよいです。

ここではディレクトリ作って embulk 実行して、rb スクリプトを実行。


sample.dig

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

配列で定義してループで処理することもできます。


sample.dig

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 使うことで整理できるケースもありそうですね。