概要
AirflowでWeb画面からDAGを削除しようとした場合に「DAG with id {DAG_ID} not found. Cannot delete」というエラーが出ることがある。
これの削除の仕方。
バージョン情報
- Python 3.6.7
- apache-airflow==1.10.1
CUIでの削除
CUIから「airflow delete_dag」すればたいてい削除できる。
dag_nameのところに削除したいDAGの名前を指定して下記のように実行する。
$ airflow delete_dag dag_name
これを実行するとDBから当該のレコードが概ね削除される。
schedulerに登録されていないdagを削除しようとした場合は、下記のようなエラーが出る。
airflow.exceptions.DagNotFound: Dag id count_dag not found
Web画面的には下記のようなステータスになっている場合。
This DAG seems to be existing only locally. The master scheduler doesn't seem to be aware of its eistence.
この場合はschedulerがDAGを認識していないのでschedulerを起動した状態で認識されるのを待つ。
認識後に再度 airflow delete_dag を実行。この時、所定のdags_folderにまだ当該DAGのコードがいると下記のようなエラーになる。
airflow.exceptions.DagFileExists: Dag id count_dag is still in DagBag. Remove the DAG file first.
当該ファイルをdag folderの配下から除去して実行する。
直接DBを操作して削除
それでも消えない場合はDBから直接削除する。
dag_idをカラムに持つDBは下記がある。
- dag
- dag_run
- dag_stats
- job
- log
- sla_miss
- task_fail
- task_instance
これらを where dag_id = ? で消してしまえば良いのだが、当然ながらサポート外のやり方なので何か間違いが起きても保証はできない。
scheduler、webserverは止めた状態で行った方が多少安全度が上がると思われる。
下記だとログ等も含めて指定dag_idの各種レコードが一掃される。
delete from dag where dag_id='hello_dag'; delete from dag_run where dag_id='hello_dag'; delete from dag_stats where dag_id='hello_dag'; delete from job where dag_id='hello_dag'; delete from log where dag_id='hello_dag'; delete from sla_miss where dag_id='hello_dag'; delete from task_fail where dag_id='hello_dag'; delete from task_instance where dag_id='hello_dag';
改定履歴
Author: Masato Watanabe, Date: 2019-02-18, 記事投稿