はじめに
digdagはトレジャーデータが公開しているOSSのワークフローマネージャーです。
digdagを使うのは初めてなので、まずは勉強として開発用に使用するローカルモードでサンプルワークフローを動かしてみました。
digdagのインストール
digdagのGet startedを参考にインストールを実施します。
# curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
# chmod +x ~/bin/digdag
# echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
# source ~/.bashrc
お試しだったので、rootユーザのbin以下にインストールしていますが、/usr/local/binなどインストールした方が良いと思います。
サンプルワークフローを動かす
digdag initコマンドでサンプルのワークフローを作成できます。
この例ではmydigディレクトリ以下に、mydag.digというファイルが生成されます。
# digdag init mydag
mydag.digファイルの内容は以下のようになっています。
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}
このワークフローをローカルモードで実行するには、digdag runコマンドを使用します。
# cd mydag
# digdag run mydag.dig
実行した結果、以下のようにコンソールに出力されました。
2019-09-26 14:54:02 +0200 [WARN] (main): Using a new session time 2019-09-26T00:00:00+00:00.
2019-09-26 14:54:02 +0200 [INFO] (main): Using session /root/mydag/.digdag/status/20190926T000000+0000.
2019-09-26 14:54:02 +0200 [INFO] (main): Starting a new session project id=1 workflow name=mydag session_time=2019-09-26T00:00:00+00:00
2019-09-26 14:54:03 +0200 [INFO] (0016@[0:default]+mydag+setup): echo>: start 2019-09-26T00:00:00+00:00
start 2019-09-26T00:00:00+00:00
2019-09-26 14:54:05 +0200 [INFO] (0016@[0:default]+mydag+disp_current_date): echo>: 2019-09-26 00:00:00 +00:00
2019-09-26 00:00:00 +00:00
2019-09-26 14:54:06 +0200 [INFO] (0016@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]}
2019-09-26 14:54:07 +0200 [INFO] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog
first dog
2019-09-26 14:54:07 +0200 [INFO] (0020@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): echo>: third dog
third dog
2019-09-26 14:54:07 +0200 [INFO] (0019@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): echo>: second cat
second cat
2019-09-26 14:54:07 +0200 [INFO] (0018@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): echo>: second dog
second dog
2019-09-26 14:54:07 +0200 [INFO] (0021@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): echo>: third cat
third cat
2019-09-26 14:54:07 +0200 [INFO] (0017@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): echo>: first cat
first cat
2019-09-26 14:54:08 +0200 [INFO] (0017@[0:default]+mydag+teardown): echo>: finish 2019-09-26T00:00:00+00:00
finish 2019-09-26T00:00:00+00:00
Success. Task state is saved at /root/mydag/.digdag/status/20190926T000000+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.
もう一度実行すると、既に実行済みのため各タスクはスキップされます。
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+setup): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+disp_current_date): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=1=cat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0016@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=0=dog): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0017@[0:default]+mydag+repeat^sub+for-0=order=1=second&1=animal=1=cat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0018@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=0=dog): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0019@[0:default]+mydag+repeat^sub+for-0=order=2=third&1=animal=1=cat): Skipped
2019-09-26 15:28:31 +0200 [WARN] (0017@[0:default]+mydag+teardown): Skipped
Success. Task state is saved at /root/mydag/.digdag/status/20190926T000000+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.
- セッションタイム(ワークフローの実行時間)を出力する
+で始まっているものがタスクで、上から順番に実行されます。
echo>となっているものがオペレーターで、echoによりメッセージを表示します。
ここでは「start ${session_time}」というメッセージを表示するということになります。
+setup:
echo>: start ${session_time}
[INFO] (0016@[0:default]+mydag+setup): echo>: start 2019-09-26T00:00:00+00:00
start 2019-09-26T00:00:00+00:00
- セッションタイムのフォーマットを変換し表示する
${...}と書いた場合、JavaScriptとして展開されます。
以下ではdigdagにバンドルされている日付操作用のMoment.jsを使用しています。
+disp_current_date:
echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')}
[INFO] (0016@[0:default]+mydag+disp_current_date): echo>: 2019-09-26 00:00:00 +00:00
2019-09-26 00:00:00 +00:00
- 並列で配列のデータを表示する
order, animalという2つの配列に対してfor文を実行しています。
この場合は3×2=6回実行されることになります。
_parallel: true を指定すると、並列実行になります。
+repeat:
for_each>:
order: [first, second, third]
animal: [dog, cat]
_do:
echo>: ${order} ${animal}
_parallel: true
[INFO] (0016@[0:default]+mydag+repeat): for_each>: {order=[first, second, third], animal=[dog, cat]}
2019-09-26 14:54:07 +0200 [INFO] (0016@[0:default]+mydag+repeat^sub+for-0=order=0=first&1=animal=0=dog): echo>: first dog
first dog
~省略~
digdag checkコマンドでは、ワークフローの定義とスケジュールを表示します。
# digdag check
2019-09-27 13:12:28 +0200: Digdag v0.9.39
2019-09-27 13:12:30 +0200 [INFO] (main): Database migration started
2019-09-27 13:12:30 +0200 [INFO] (main): Applying database migration:20151204221156
~省略~
2019-09-27 13:12:30 +0200 [INFO] (main): Database migration successfully finished.
System default timezone: Europe/Vienna
Definitions (1 workflows):
mydag (5 tasks)
Parameters:
{}
Schedules (0 entries):
スケジュール実行
次はスケジュール実行を試してみます。
先ほどのmydag.digファイルのトップレベルに以下の2行を追加します。
これは1分インターバルで実行する意味になります。
schedule:
minutes_interval>: 1
スケジュール実行するため、digdag schedulerコマンドを使用します。
なお、mydag.digを変更すると自動で読み込み直すので再起動は必要ありません。
実行すると、以下のように1分ごとにメッセージが出力されるのを確認できます。
# digdag scheduler -b 0.0.0.0
2019-09-27 15:14:02 +0200 [INFO] (0033@[0:default]+mydag+setup): echo>: start 2019-09-27T13:14:00+00:00
start 2019-09-27T13:14:00+00:00
2019-09-27 15:15:00 +0200 [INFO] (0037@[0:default]+mydag+setup): echo>: start 2019-09-27T13:15:00+00:00
start 2019-09-27T13:15:00+00:00
2019-09-27 15:16:00 +0200 [INFO] (0038@[0:default]+mydag+setup): echo>: start 2019-09-27T13:16:00+00:00
start 2019-09-27T13:16:00+00:00