iMind Developers Blog

iMind開発者ブログ

AirflowでFailedのタスクをまとめてリトライ

概要

週明けに出社したらAirflowのTask Instancesが真っ赤になっていた。

f:id:imind:20190221201029p:plain

そんな時、1つずつタスクをリトライしていくのは辛いのでコマンドでまとめてリトライする方法を確認する。

また、再実行する必要がない場合にまとめてSuccessにアップデートする方法についても確認する。

Web UIから1つずつ再実行する場合

Task InstancesなどでリトライしたいTaskのDag Idを開く。

f:id:imind:20190221201656p:plain

Failedになっているタスク(下記画像では左下のhello)をクリックすると、Run, Clearなどが選択できるダイアログが表示されるので、Clearを選択。

f:id:imind:20190221201839p:plain

OKを選択する。

f:id:imind:20190221202034p:plain

これでFailedになっていたステータスがクリアされるので、スケジューラーが再実行する対象になる。

コマンドで一括クリア

リトライしたいタスクの数が多くなるとWeb UIでちまちまステータスを変更していくのは辛い。

clearコマンドで指定条件のタスクのステータスを一括でクリアできる。

airflow clear \
    [-t TASK_REGEX] \
    [-s START_DATE] \
    [-e END_DATE] \
    [--only_failed] \
    dag_id

試しに2019-01-29 〜 2019-01-31までのFailedのタスクをクリアしてみる。

$ airflow clear \
    -t hello \
    -s 2019-01-29 \
    -e 2019-01-31 \
    --only_failed \
    hello_dag

コマンドを実行すると対象のタスクが表示され、確認を求められる。

You are about to delete these 3 tasks:
<TaskInstance: hello_dag.hello 2019-01-29 00:00:00+00:00 [failed]>
<TaskInstance: hello_dag.hello 2019-01-30 00:00:00+00:00 [failed]>
<TaskInstance: hello_dag.hello 2019-01-31 00:00:00+00:00 [failed]>

Are you sure? (yes/no): 

yesを選択すると対象のタスクのStateがNoneになりスケジューラーの実行対象になる。

f:id:imind:20190221203625p:plain

backfillで再実行する

backfillを使うとclearしたタスクやまだ実行していないタスクを一括実行できる。

エラーから復帰するまでスケジューラーを止めている時など、スケジューラーを起動する前にコマンドで経過を見ながらタスクのstateを埋めることができる。

airflow backfill \
    [-t TASK_REGEX] \
    [-s START_DATE] \
    [-e END_DATE] \
    [--mark_success] \
    [--ignore_dependencies] \
    [--dry_run] \
    [--reset_dagruns] \
    [--rerun_failed_tasks] \
    dag_id

1/28〜1/30までを実行してみる。先程のclearコマンドで1/29〜1/31はStateがNoneになっているが、1/28はFailedの状態。

$ airflow backfill \
    -t hello \
    -s 2019-01-28 \
    -e 2019-01-30 \
    hello_dag

実行結果。Failedだった1/28は実行されず、1/29と1/30のみ実行されている。

f:id:imind:20190221212143p:plain

--rerun_failed_tasks を指定すればFailedのタスクも実行される。

$ airflow backfill \
    -t hello \
    -s 2019-01-28 \
    -e 2019-01-30 \
    --rerun_failed_tasks \
    hello_dag

実行せずにSuccessをマークする

--mark_successを指定するとタスクを実行せずにStateをSuccessに変更する。

$ airflow backfill \
    -t hello \
    -s 2019-01-15 \
    -e 2019-01-17 \
    --mark_success \
    hello_dag

実行すると律儀に各タスクをQueueに入れてRunning、Successと遷移させていくが、Taskの中身自体は実行されない。

改定履歴

Author: Masato Watanabe, Date: 2019-02-22, 記事投稿