LoginSignup
2
1

More than 3 years have passed since last update.

digdagのローカルモードでサンプルを動かしてみる(実行メモ)

Posted at

はじめに

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ファイルの内容は以下のようになっています。

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
2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1