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é.
Edit 27/08/18 - Airflow 1.10 est maintenant disponible sur PyPI!
https://pypi.org/project/Apache-airflow/1.10.0/
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.
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!
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)
Pas sûr pourquoi Apache Airflow n'a pas un moyen évident et facile de supprimer un DAG
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)
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()
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
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é.
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.
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
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:
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.
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
supprimez-le simplement de mysql, ça fonctionne très bien pour moi. supprimez-les des tableaux ci-dessous:
dag
dag_constructor
(il pourrait y avoir plus de tables dans les prochaines versions), puis redémarrez le serveur Web et le travailleur.
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).
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.