web-dev-qa-db-ja.com

エアフロー:DAGを削除する方法は?

Airflow Webサーバーを起動し、いくつかのスケジュールを設定しました。 Web GUIでくぼみを見ることができます。

特定のDAGを実行から削除してWeb GUIに表示するにはどうすればよいですか?それを行うためのAirflow CLIコマンドはありますか?

見回したが、DAGがロードされてスケジュールされた後、DAGを削除する簡単な方法の答えが見つかりませんでした。

58
subba

編集8/27/18-Airflow 1.10がPyPIでリリースされました!

https://pypi.org/project/Apache-airflow/1.10.0/


DAGを完全に削除する方法

Airflow≥1.10でこの機能を使用できるようになりました!

PR #2199 (Jira: AIRFLOW-1002 )DAGの削除をAirflowに追加すると、関連するすべてのテーブルからDAGのエントリを完全に削除できるようになりました。

コア delete_dag(...) コードは実験的なAPIの一部であり、利用可能なエントリポイントがあります CLI経由 および REST AP​​I

CLI:

airflow delete_dag my_dag_id

REST API(ウェブサーバーをローカルで実行):

curl -X "DELETE" http://127.0.0.1:8080/api/experimental/dags/my_dag_id

REST AP​​Iに関する警告:Airflowクラスター 認証を使用 が本番環境であることを確認します。

Airflow 1.10のインストール/アップグレード(現在)

アップグレードするには、次のいずれかを実行します。

export SLUGIFY_USES_TEXT_UNIDECODE=yes

または:

export AIRFLOW_GPL_UNIDECODE=yes

次に:

pip install -U Apache-airflow

詳細については、最初に PDATING.md を確認してください。

43
Taylor Edmiston

これは、デフォルトのconnection_idでPostgresHookを使用した私の適応コードです。

import sys
from airflow.hooks.postgres_hook import PostgresHook

dag_input = sys.argv[1]
hook=PostgresHook( postgres_conn_id= "airflow_db")

for t in ["xcom", "task_instance", "sla_miss", "log", "job", "dag_run", "dag" ]:
    sql="delete from {} where dag_id='{}'".format(t, dag_input)
    hook.run(sql, True)
18

Apache AirflowにDAGを削除する明白で簡単な方法がない理由がわからない

提出済み https://issues.Apache.org/jira/browse/AIRFLOW-1002

12
Tagar

特定のDAGに関連するすべてを削除するスクリプトを作成しましたが、これはMySQL専用です。 PostgreSQLを使用している場合は、別のコネクタメソッドを記述できます。もともとLanceが https://groups.google.com/forum/#!topic/airbnb_airflow/GVsNsUxPRC に投稿したコマンドは、スクリプトに入れました。お役に立てれば。形式:python script.py dag_id

import sys
import MySQLdb

dag_input = sys.argv[1]

query = {'delete from xcom where dag_id = "' + dag_input + '"',
        'delete from task_instance where dag_id = "' + dag_input + '"',
        'delete from sla_miss where dag_id = "' + dag_input + '"',
        'delete from log where dag_id = "' + dag_input + '"',
        'delete from job where dag_id = "' + dag_input + '"',
        'delete from dag_run where dag_id = "' + dag_input + '"',
        'delete from dag where dag_id = "' + dag_input + '"' }

def connect(query):
        db = MySQLdb.connect(Host="hostname", user="username", passwd="password", db="database")
        cur = db.cursor()
        cur.execute(query)
        db.commit()
        db.close()
        return

for value in query:
        print value
        connect(value)
10
Oleg Yamin

Airflow 1.10.1がリリースされました。このリリースでは、ファイルシステムから対応するDAGを削除した後、Web UIからDAGを削除する機能が追加されています。

詳細については、このチケットを参照してください。

[AIRFLOW-2657] Web UIからDAGを削除する機能を追加

Airflow Links menu with delete icon

これは実際にはファイルシステムからDAGを削除しないことに注意してください。最初に手動でこれを行う必要があります。そうしないと、DAGがリロードされます。

5
Jaco

DAG-sはAirflow 1.10で削除できますが、アクションのプロセスとシーケンスは正しい必要があります。 「卵と鶏肉の問題」があります-ファイルがまだある間にフロントエンドからDAGを削除すると、DAGがリロードされます(ファイルは削除されないため)。最初にファイルを削除してページを更新すると、DAGはWeb GUIから削除できなくなります。したがって、フロントエンドからDAGを削除できる一連のアクションは次のとおりです。

  1. dAGファイルを削除します(私の場合は、パイプラインリポジトリから削除し、エアフローサーバーに展開します(特にスケジューラー))
  2. Web GUIを更新しないでください。
  3. DAGビュー(通常のフロントページ)のWeb GUIで、[DAGの削除]をクリックします-> enter image description here 右端の赤いアイコン。
  4. このDAGの残りすべてをデータベースからクリーンアップします。
5
Sven

デフォルトのSQLite DBの特定のデータに関連するすべてのメタデータを削除するスクリプトを作成しました。これは上記のイエスの答えに基づいていますが、PostgresからSQLiteに適応しました。ユーザーは、../airflow.dbを、デフォルトのairflow.dbファイルを基準にしてscript.pyが保存されている場所(通常は~/airflow)に設定する必要があります。実行するには、python script.py dag_idを使用します。

import sqlite3
import sys

conn = sqlite3.connect('../airflow.db')
c = conn.cursor()

dag_input = sys.argv[1]

for t in ["xcom", "task_instance", "sla_miss", "log", "job", "dag_run", "dag" ]:
    query = "delete from {} where dag_id='{}'".format(t, dag_input)
    c.execute(query)

conn.commit()
conn.close()
5
jeff

Airflowに組み込まれているものはありません。 DAGを削除するには、リポジトリから削除し、Airflowメタストアテーブルのデータベースエントリを削除します-dag。

2
kvb

一連のタスクインスタンスを、それらが実行されなかったかのようにクリアできます。

airflow clear dag_id -s 2017-1-23 -e 2017-8-31

そして、dagsフォルダーからdagファイルを削除します

1
David Lexa

それをmysqlから削除するだけで、私にとってはうまくいきます。それらを以下の表から削除します。

  • ダグ

  • dag_constructor

  • dag_group_ship
  • dag_pickle
  • dag_run
  • dag_stats

(将来のリリースではさらにテーブルが増える可能性があります)、ウェブサーバーとワーカーを再起動します。

0
user2892949

バージョン> = 1.10.0:

エアフローバージョン1.10.2があり、airflow delete_dagコマンドを実行しようとしましたが、コマンドは次のエラーをスローします。

bash-4.2#airflow delete_dag dag_id

[2019-03-16 15:37:20,804] {settings.py:174}情報-settings.configure_orm():プール設定を使用しています。 pool_size = 5、pool_recycle = 1800、pid = 28224 /usr/lib64/python2.7/site-packages/psycopg2/init.py:144: UserWarning:psycopg2 wheelパッケージはリリース2.8から名前が変更されます。バイナリからインストールを続けるには、代わりに「pip install psycopg2-binary」を使用してください。詳細については、 http://initd.org/psycopg/docs/install.html#binary-install-from-pypi を参照してください。 "" ")これにより、指定されたDAGに関連する既存のすべてのレコードが削除されますProceed?(y/n)yトレースバック(最後の最後の呼び出し):args.func( args)ファイル「/usr/lib/python2.7/site-packages/airflow/utils/cli.py」、74行目、ラッパーでreturn f(* args、** kwargs)File "/ usr/lib/python2 7/site-packages/airflow/bin/cli.py "、行258、delete_dagでAirflowException(err)のairflow.exceptions.AirflowException:サーバーエラーを発生させます

Curlコマンドを使用して削除できますが。誰かがこのコマンドの実行について知っているか、これが知られているか、何か間違ったことをしている場合、私に知らせてください。

バージョン<= 1.9.0:

DAGを削除するコマンドはありません。したがって、まずDAGファイルを削除してから、気流メタデータデータベースからdag_idへのすべての参照を削除する必要があります。

警告

エアフローメタデータベースをリセットできます。ダグを含むすべてを消去しますが、履歴、プール、変数なども消去することを忘れないでください。

airflow resetdb、次にairflow initdb

0

Dagsフォルダーからdag(削除する)を削除し、airflow resetdbを実行します。

または、airflow_dbに移動して、それらのエントリをdagテーブル(task_fail、xcom、task_instance、sla_miss、log、job、dag_run、dag、dag_stats)から手動で削除することもできます。

0
Ayush Chauhan

@OlegYaminの答えに基づいて、私はpostgresに裏打ちされた気流を削除するために次のことをしています。気流はpublicスキーマを使用します。

delete from public.dag_pickle where id = (
    select pickle_id from public.dag where dag_id = 'my_dag_id'
);
delete from public.dag_run where dag_id = 'my_dag_id';
delete from public.dag_stats where dag_id = 'my_dag_id';
delete from public.log where dag_id = 'my_dag_id';
delete from public.sla_miss where dag_id = 'my_dag_id';
delete from public.task_fail where dag_id = 'my_dag_id';
delete from public.task_instance where dag_id = 'my_dag_id';
delete from public.xcom where dag_id = 'my_dag_id';
delete from public.dag where dag_id = 'my_dag_id';

WARNING:最初の削除クエリの効果/正確性は不明です。それは単に必要であるという仮定です。

0