web-dev-qa-db-fra.com

Airflow: comment supprimer un DAG?

J'ai démarré le serveur Web Airflow et planifié des dags. Je peux voir les dags sur l'interface graphique Web.

Comment puis-je supprimer un groupe de disponibilité de base de données particulier d'être exécuté et affiché dans l'interface graphique Web? Existe-t-il une commande Airflow CLI pour le faire?

J'ai regardé autour de moi mais je n'ai pas trouvé de réponse à un moyen simple de supprimer un DAG une fois qu'il a été chargé et planifié.

50
subba

Edit 27/08/18 - Airflow 1.10 est maintenant disponible sur PyPI!

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


Comment supprimer complètement un DAG

Nous avons cette fonctionnalité maintenant dans Airflow ≥ 1.10!

Le PR # 2199 (Jira: AIRFLOW-1002 ) ajoutant la suppression du DAG à Airflow a été fusionné, ce qui permet de supprimer complètement les entrées d'un DAG de toutes les tables associées.

Le code core delete_dag (...) fait maintenant partie de l'API expérimentale et des points d'entrée sont disponibles via le CLI et aussi via l'API REST .

CLI:

airflow delete_dag my_dag_id

API REST (serveur Web exécuté localement):

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

Avertissement concernant l'API REST: assurez-vous que votre cluster Airflow utilise authentication en production.

Installation/mise à niveau vers Airflow 1.10 (actuel)

Pour mettre à niveau, exécutez soit:

export SLUGIFY_USES_TEXT_UNIDECODE=yes

ou:

export AIRFLOW_GPL_UNIDECODE=yes

Ensuite:

pip install -U Apache-airflow

N'oubliez pas de vérifier UPDATING.md first pour plus de détails!

37
Taylor Edmiston

Ceci est mon code adapté utilisant PostgresHook avec le connection_id par défaut.

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)
17

Pas sûr pourquoi Apache Airflow n'a pas un moyen évident et facile de supprimer un DAG

Classé https://issues.Apache.org/jira/browse/AIRFLOW-1002

11
Tagar

Je viens d'écrire un script qui supprime tout ce qui concerne un dag particulier, mais ce n'est que pour MySQL. Vous pouvez écrire une méthode de connecteur différente si vous utilisez PostgreSQL. À l'origine, les commandes étaient publiées par Lance sur https://groups.google.com/forum/#!topic/airbnb_airflow/GVsNsUxPRC0 Je viens de le mettre dans un script. J'espère que cela t'aides. Format: 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

J'ai écrit un script qui supprime toutes les métadonnées liées à un dag spécifique pour la base de données SQLite par défaut. Ceci est basé sur la réponse de Jésus ci-dessus mais adapté de Postgres à SQLite. Les utilisateurs doivent définir ../airflow.db à l'emplacement où script.py est stocké par rapport au fichier airflow.db par défaut (généralement ~/airflow). Pour exécuter, utilisez 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 1.10.1 a été publié. Cette version ajoute la possibilité de supprimer un DAG de l'interface utilisateur Web.

Voir ce billet pour plus de détails:

[AIRFLOW-2657] Ajout de la possibilité de supprimer DAG de l'interface Web

 Airflow Links menu with delete icon

Veuillez noter que cela ne supprime pas le DAG du système de fichiers, vous devrez le faire manuellement d'abord, sinon le DAG sera rechargé.

2
Jaco

Il n'y a rien dans Airflow qui le fasse pour vous. Afin de supprimer le DAG, supprimez-le du référentiel, puis supprimez les entrées de la base de données dans le métastore de table Airflow.

2
kvb

Vous pouvez effacer un ensemble d'instances de tâches, comme si elles ne s'étaient jamais exécutées avec:

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

Et puis supprimez le fichier dag du dossier dags

1
David Lexa

Les DAG-s peuvent être supprimés dans Airflow 1.10 mais le processus et la séquence d'actions doivent être corrects. Il y a un "problème d'oeuf et de poulet" - si vous supprimez le DAG de l'interface alors que le fichier est toujours là, le DAG est rechargé (car le fichier n'est pas supprimé). Si vous supprimez d'abord le fichier et actualisez la page, le DAG ne peut plus être supprimé de l'interface Web. Donc, la séquence d'actions qui m'a permis de supprimer un DAG de l'interface était la suivante:

  1. supprimer le fichier DAG (dans mon cas, supprimer du référentiel de pipeline et le déployer sur des serveurs de flux d'air, notamment le planificateur)
  2. NE PAS actualiser l'interface graphique Web.
  3. Dans l'interface graphique Web de la vue des DAG (page d'accueil normale), cliquez sur "Supprimer le jour" ->  enter image description here  l'icône rouge à l'extrême droite.
  4. Il nettoie tous les restes de ce DAG de la base de données.
1
Sven

versions> = 1.10.0:

airflow delete_dag <dag_id> 

versions <= 1.9.0:

Il n'existe pas de commande permettant de supprimer un dag. Vous devez donc d'abord supprimer le fichier dag, puis supprimer toutes les références au dag_id de la base de métadonnées de flux d'air.

ATTENTION

Vous pouvez réinitialiser la méta base de données de flux d'air, vous effacez tout, y compris les dags, mais n'oubliez pas que vous effacerez également l'historique, les pools, les variables, etc.

airflow resetdb puis airflow initdb

1
Facundo Diaz Cobos

supprimez-le simplement de mysql, ça fonctionne très bien pour moi. supprimez-les des tableaux ci-dessous:

  • dag

  • dag_constructor

  • dag_group_ship
  • dag_pickle
  • dag_run
  • dag_stats

(il pourrait y avoir plus de tables dans les prochaines versions), puis redémarrez le serveur Web et le travailleur.

0
user2892949

Supprimez le dag (que vous souhaitez supprimer) du dossier dags et exécutez airflow resetdb.

Vous pouvez également accéder à airflow_db et supprimer manuellement ces entrées des tables dag (task_fail, xcom, tâche_instance, sla_miss, journal, job, dag_run, dag, dag_stats).

0
Ayush Chauhan

Sur la base de la réponse de @OlegYamin, voici ce que je fais pour supprimer un dag soutenu par postgres, dans lequel airflow utilise le schéma 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: L'effet/la correction de la première requête de suppression m'est inconnu. C'est juste une hypothèse que c'est nécessaire.

0
André C. Andersen