ワークフローエンジンDigdagの始め方

スポンサーリンク

仕事で Digdag を導入することになったので少しずつ情報をまとめていきます。最初は HelloWorld 的にワークフローエンジン Digdag の始め方について。

f:id:tasukujp:20190328150935p:plain

Digdag – Open Source Workflow Engine for the Multi-Cloud Era

Digdag のインストール

インストールはバイナリをダウンロードして実行権限を付けるだけです。

$ curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
$ chmod +x ~/bin/digdag
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc

Digdag を実行するには Java8 (8u72) 以上が必要になります。

$ java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

MacでHomebrewを使用して複数バージョンのJava (JDK) をインストールして切り替える方法+アップデート - TASK NOTES

コマンドが実行できたら準備完了です。

$ ./bin/digdag --version
0.9.35

Digdag のアップデート

selfupdate コマンドでバイナリをアップデートすることができます。

$ ~/bin/digdag selfupdate <version|latest>

ワークフローの実行

init コマンドでサンプルワークフローを作成しましょう。

$ ~/bin/digdag init mydag
2019-04-06 23:39:28 +0900: Digdag v0.9.35
  Creating mydag/mydag.dig
  Creating mydag/.gitignore
Done. Type `cd mydag` and then `digdag run mydag.dig` to run the workflow. Enjoy!

run コマンドでワークフローを実行できます。

$ cd mydag/
$ ~/bin/digdag run mydag.dig
2019-04-06 23:39:44 +0900: Digdag v0.9.35
2019-04-06 23:39:45 +0900 [WARN] (main): Using a new session time 2019-04-06T00:00:00+00:00.
2019-04-06 23:39:45 +0900 [INFO] (main): Using session /Users/tasukujp/Documents/digdag/mydag/.digdag/status/20190406T000000+0000.
2019-04-06 23:39:45 +0900 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2019-04-06T00:00:00+00:00
2019-04-06 23:39:47 +0900 [INFO] (0017@[0:default]+mydag+setup): echo>: start 2019-04-06T00:00:00+00:00
start 2019-04-06T00:00:00+00:00
2019-04-06 23:39:47 +0900 [INFO] (0017@[0:default]+mydag+disp_current_date): echo>: 2019-04-06 00:00:00 +00:00
2019-04-06 00:00:00 +00:00
2019-04-06 23:39:48 +0900 [INFO] (0017@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]}
2019-04-06 23:39:48 +0900 [INFO] (0018@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat
first cat
2019-04-06 23:39:48 +0900 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat
second cat
2019-04-06 23:39:48 +0900 [INFO] (0017@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog
first dog
2019-04-06 23:39:48 +0900 [INFO] (0019@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog
second dog
2019-04-06 23:39:48 +0900 [INFO] (0022@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat
third cat
2019-04-06 23:39:49 +0900 [INFO] (0021@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog
third dog
2019-04-06 23:39:49 +0900 [INFO] (0021@[0:default]+mydag+teardown): echo>: finish 2019-04-06T00:00:00+00:00
finish 2019-04-06T00:00:00+00:00
Success. Task state is saved at /Users/tasukujp/Documents/digdag/mydag/.digdag/status/20190406T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.

実行した mydig.dig ファイルは以下のようになっています。 YAML で書かれているのでシンプルで分かりやすいですね。拡張子が .yml じゃないのは map のキーの順番が維持される必要があるためだそうです。

timezone: UTC

+setup:
  echo>: start ${session_time}

+disp_current_date:
  echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')}

+repeat:
  for_each>:
    order: [first, second, third]
    animal: [dog, cat]
  _do:
    echo>: ${order} ${animal}
  _parallel: true

+teardown:
  echo>: finish ${session_time}

依存関係のあるタスクを順番に実行することができるので cron でジョブの終了時間を考慮する必要がなくなりますね。今回はこんな所でそれでは次回。

Getting started — Digdag documentation