概要
週明けに出社したらAirflowのTask Instancesが真っ赤になっていた。
そんな時、1つずつタスクをリトライしていくのは辛いのでコマンドでまとめてリトライする方法を確認する。
また、再実行する必要がない場合にまとめてSuccessにアップデートする方法についても確認する。
Web UIから1つずつ再実行する場合
Task InstancesなどでリトライしたいTaskのDag Idを開く。
Failedになっているタスク(下記画像では左下のhello)をクリックすると、Run, Clearなどが選択できるダイアログが表示されるので、Clearを選択。
OKを選択する。
これで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になりスケジューラーの実行対象になる。
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のみ実行されている。
--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, 記事投稿