iMind Developers Blog

iMind開発者ブログ

AirflowでWeb画面からDAGを消せなかった場合

概要

AirflowでWeb画面からDAGを削除しようとした場合に「DAG with id {DAG_ID} not found. Cannot delete」というエラーが出ることがある。

f:id:imind:20181221031547p:plain

これの削除の仕方。

バージョン情報

  • 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画面的には下記のようなステータスになっている場合。

f:id:imind:20181221032131p:plain

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, 記事投稿