iMind Developers Blog

iMind開発者ブログ

Airflowのremoved stateのTaskを削除する

概要

Airflowでdagの実行中にタスクをソースコードから削除すると、stateがremovedになったタスクがTask Instancesのトップに表示されたままになることがある。

f:id:imind:20190509190619p:plain

フィルタでState not contains removedとすれば消えるけど、邪魔なので根本的に削除する方法を調べる。

しっくりくる方法が見つからなかったのでゴリ押ししています。本記事の方法は非推奨です。

バージョン情報

  • Airflow 1.10.3

airflow clearでは削除できない

airflow clearで消せれば良いのだけど、下記のように実行してもremovedになっているタスクは候補に表示されない。

$ airflow clear ${dag_id}

-t ${task_id} を指定しても候補に挙がらない。

一時的に削除したタスクを戻す

コマンド等で削除する良い方法が見つからなかったので、当該dagにremovedになっているのと同じtask_idで適当なOperatorを生成する。

from airflow.operators.bash_operator import BashOperator
BashOperator(
    dag=dag,
    task_id='removed_task_id_name',
    bash_command='echo 1'
)

これで再度実行対象となりsuccessになって上部から消えてくれるはず。

これでも実行されない時は airflow clear -t ${task_id} ${dag_id} したり airflow runt ${dag_id} ${task_id} ${execution_date} したりweb uiからsuccessステートを設定するなど、何かしらの方法で実行する。

無事stateがsuccessになったら、コード上から当該タスクをまた消す。

DBから消してしまう

面倒だからDB操作で消してしまおうと思うことはよくある。

select * from task_instance where state = 'removed'

試しに上記WHERE句の条件でdeleteを実行してみたが特に問題なく動作した。既にremovedになっているTaskなので消しても悪さをすることはあまりないと思われる。

もう面倒だからdagごと消して再開する

いろいろ消してリセットしたい気持ちになった時に、一度dagごと消してしまう手もないことはない。

手順としては下記のようなイメージ。

1. web uiで消したいdagをOFFにしておいて、今実行中のTaskがあれば終了するのを待つ。

2. airflow next_execution ${dag_id} を実行して次の execution_time を取得、メモしておく。

3. 終了したらdagの書かれたpythonファイルを隔離する。対象ファイル名は仮にfoo.pyとしておく。

$ mv foo.py ../

4. web ui上のLinksの右端にある赤い×を押して対象のdagを削除する。

f:id:imind:20190509190630p:plain

5. foo.pyに記載されているstart_dateを2でメモしたExecution Dateに書き換える。

6. $AIRFLOW_HOME/logs/${dag_id} のログを削除する(任意)。

7. foo.pyを復帰する。

$ mv ../foo.py .

さっぱりした(非推奨)

最後に

ちゃんと考えてテストや運用をしていればこんな方法を取る必要に迫られることはありません。

運用中に適当にコードを書き換えたりタスクを止めずにpullしたりする私が主に悪いです。

改定履歴

Author: Masato Watanabe, Date: 2019-05-10, 記事投稿