Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Digdagのセッションについて調査メモ

More than 3 years have passed since last update.

Digdagのセッションについての調査メモです。

以下のようなworkflowがあるとする。

yml
+task1:
  sh>: echo task1

+task2:
  sh>: echo task2

+task3:
  sh>: echo task3

初回実行してみる。

$ digdag run workflow.dig
2017-03-15 20:25:15 +0900: Digdag v0.9.5
2017-03-15 20:25:17 +0900 [WARN] (main): Using a new session time 2017-03-15T00:00:00+00:00.
2017-03-15 20:25:17 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:25:18 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:25:20 +0900 [INFO] (0017@+workflow+task1): sh>: echo task1
task1
2017-03-15 20:25:21 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:25:22 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+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.

workflowが実行された。

すぐにもう一度実行してみる。

$ digdag run workflow.dig
2017-03-15 20:26:12 +0900: Digdag v0.9.5
2017-03-15 20:26:14 +0900 [WARN] (main): Reusing the last session time 2017-03-15T00:00:00+00:00.
2017-03-15 20:26:14 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:26:14 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:26:15 +0900 [WARN] (0017@+workflow+task1): Skipped
2017-03-15 20:26:15 +0900 [WARN] (0017@+workflow+task2): Skipped
2017-03-15 20:26:15 +0900 [WARN] (0017@+workflow+task3): Skipped
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+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.

2度目は処理が実行されずスキップされている。

セッションの情報は.digdagディレクトリ下に日付がついて保存されている。
ここにtask1,task2,task3の実行が成功したという状態が保存されているため、2度目の実行はスキップされる。

以下のような状態で保存されている。

$ ls -l .digdag/status/20170315T000000+0000
total 32
-rw-r--r--  1 toyama-h  wheel  174  3 15 20:26 +workflow+task1.yml
-rw-r--r--  1 toyama-h  wheel  174  3 15 20:26 +workflow+task2.yml
-rw-r--r--  1 toyama-h  wheel  174  3 15 20:26 +workflow+task3.yml
-rw-r--r--  1 toyama-h  wheel  168  3 15 20:26 +workflow.yml

このまま何度digdag runしても処理は永久にSkipされる。なぜ?

--sessionオプション

--sessionには引数として、

  • hourly
  • daily
  • last
  • "yyyy-MM-dd"
  • "yyyy-MM-dd HH:mm:SS"

が指定可能。
この--sessionのデフォルト値はlast(最後に実行されたセッションを適用)になるため、2回め以降の実行は永久にスキップされてしまう。

--session hourlyで実行してみる。

$ digdag run workflow.dig --session hourly
2017-03-15 20:37:23 +0900: Digdag v0.9.5
2017-03-15 20:37:25 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+0000.
2017-03-15 20:37:25 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T11:00:00+00:00
2017-03-15 20:37:27 +0900 [INFO] (0017@+workflow+task1): sh>: echo task1
task1
2017-03-15 20:37:27 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:37:28 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+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.

今度は実行された。

$ ls -l .digdag/status/
total 0
drwxr-xr-x  6 toyama-h  wheel  204  3 15 20:25 20170315T000000+0000
drwxr-xr-x  6 toyama-h  wheel  204  3 15 20:37 20170315T110000+0000

時間付きのディレクトリが作成されている。

もう一度実行しても、そのhour内であれば処理はskipされる。

$ digdag run workflow.dig --session hourly                                                                                                                       1 ↵
2017-03-15 20:43:58 +0900: Digdag v0.9.5
2017-03-15 20:43:59 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+0000.
2017-03-15 20:44:00 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T11:00:00+00:00
2017-03-15 20:44:00 +0900 [WARN] (0017@+workflow+task1): Skipped
2017-03-15 20:44:00 +0900 [WARN] (0017@+workflow+task2): Skipped
2017-03-15 20:44:00 +0900 [WARN] (0017@+workflow+task3): Skipped
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T110000+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.

このセッションは自分で日付指定する事もできる。
例えばmonthlyなセッションを作りたい場合は以下のようにする。

$ digdag run workflow.dig --session "`date '+%Y-%m-01'`"

%dの部分だけを01などで固定する事によってmonthlyにしている。

-sオプション

taskを途中から実行する際には-sを使う。
セッションを消して,dailyで実行してみる。

$ rm -rf .digdag/status/20170315T000000+0000
$ digdag run workflow.dig -s '+workflow+task2' --session daily
2017-03-15 20:53:06 +0900: Digdag v0.9.5
2017-03-15 20:53:09 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:53:09 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:53:10 +0900 [INFO] (0017@+workflow+task1): sh>: echo task1
task1
2017-03-15 20:53:11 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:53:11 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+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.

あれ?
task2から実行したいのに、task1も実行されてしまった。

もう一度実行。

$ digdag run workflow.dig -s '+workflow+task2' --session daily
2017-03-15 20:54:02 +0900: Digdag v0.9.5
2017-03-15 20:54:04 +0900 [INFO] (main): Using session /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+0000.
2017-03-15 20:54:04 +0900 [INFO] (main): Starting a new session project id=1 workflow name=workflow session_time=2017-03-15T00:00:00+00:00
2017-03-15 20:54:04 +0900 [WARN] (0017@+workflow+task1): Skipped
2017-03-15 20:54:06 +0900 [INFO] (0017@+workflow+task2): sh>: echo task2
task2
2017-03-15 20:54:06 +0900 [INFO] (0017@+workflow+task3): sh>: echo task3
task3
Success. Task state is saved at /private/tmp/tmp.jxd7km/mydag/.digdag/status/20170315T000000+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.

今度はtask2から実行出来た。
task2はtask1の成功に依存しているため、task1が成功した履歴がセッション上に必要ということになる。

毎回最初から実行したい場合は-a(--rerun)を使う。

まとめ

  • 初回実行は全てのタスクが実行されてしまう。
  • 2回目以降の実行はセッションの状態次第でskipされる。
  • 「-sを使い」且つ「2回目以降の実行」の場合のみ途中から実行できる。
  • 最初から実行したい場合は-a(--rerun)。
  • sessionのデフォルトはlastなので、-a(--rerun)を使わずに実行していれば2回目以降は永久にskipされてしまう。
toyama0919
Data Engineer.
dena_coltd
    Delight and Impact the World
https://dena.com/jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away