Airflow 气流:如何删除DAG?

Airflow 气流:如何删除DAG?,airflow,Airflow,我已经启动了Airflow Web服务器并计划了一些DAG。我可以在web GUI上看到DAG 如何删除正在运行并在web GUI中显示的特定DAG?是否有一个Airflow CLI命令来执行此操作 我环顾四周,但找不到一个简单的方法,即在加载和计划DAG后删除DAG。气流中没有内置任何东西可以为您实现这一点。为了删除DAG,请将其从存储库中删除,并删除Airflow metastore表-DAG中的数据库条目。我刚刚编写了一个脚本,删除了与特定DAG相关的所有内容,但这仅适用于MySQL。如果

我已经启动了Airflow Web服务器并计划了一些DAG。我可以在web GUI上看到DAG

如何删除正在运行并在web GUI中显示的特定DAG?是否有一个Airflow CLI命令来执行此操作


我环顾四周,但找不到一个简单的方法,即在加载和计划DAG后删除DAG。

气流中没有内置任何东西可以为您实现这一点。为了删除DAG,请将其从存储库中删除,并删除Airflow metastore表-DAG中的数据库条目。

我刚刚编写了一个脚本,删除了与特定DAG相关的所有内容,但这仅适用于MySQL。如果使用PostgreSQL,则可以编写不同的连接器方法。最初是兰斯发布的命令 我只是把它写成剧本。希望这有帮助。格式: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)

不知道为什么Apache Airflow没有一个明显且简单的方法来删除DAG


field

这是我使用带有默认连接id的Postgreshake修改的代码

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)

我编写了一个脚本,用于删除与默认SQLite DB的特定dag相关的所有元数据。这是基于上面耶稣的回答,但改编自Postgres到SQLite。用户应将
./aiffair.db
设置为相对于默认aiffair.db文件存储script.py的位置(通常为
~/aiffair
)。要执行,请使用
python script.py dag\u 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 clear dag_id -s 2017-1-23 -e 2017-8-31

然后将dag文件从dags文件夹中删除,以供仍在查找答案的用户使用。在Airflow版本1.8中,删除DAG非常困难,您可以参考上面的答案。但是自从1.9发布以来,你只需要

删除dag文件夹上的dag并重新启动Web服务器


编辑2018年8月27日-气流1.10现已在PyPI上发布


如何完全删除DAG 我们现在在“气流”中具有此功能≥ 1.10!

将DAG删除添加到气流的PR(Jira:)现已合并,允许从所有相关表中完全删除DAG的条目

核心代码现在是实验性API的一部分,有可用的入口点,也有可用的入口点

CLI:

REST API(在本地运行Web服务器):


有关REST API的警告:确保您的气流聚集在生产中

安装/升级到Airflow 1.10(当前版本) 要升级,请运行以下任一操作:

export SLUGIFY_USES_TEXT_UNIDECODE=yes
或:

然后:

记得先查看完整的细节

从dag文件夹中删除dag(您要删除),然后运行
resetdb

或者,您可以进入airflow_db并手动从dag表中删除这些条目(task_fail、xcom、task_instance、sla_miss、log、job、dag_run、dag、dag_stats)。

版本>=1.10.0:

我有airflow版本1.10.2,我尝试执行airflow delete_dag命令,但该命令引发以下错误:

bash-4.2 35;气流删除(dag)dag(id)

[2019-03-16 15:37:20804]{settings.py:174}INFO-settings.configure_orm():使用池设置。池大小=5,池回收=1800,pid=28224 /usr/lib64/python2.7/site packages/psycopg2/init.py:144:UserWarning:psycopg2控制盘软件包将从2.8版重命名;为了保持从二进制文件安装,请改用“pip安装psycopg2二进制文件”。有关详细信息,请参阅:。 """) 这将删除与指定DAG相关的所有现有记录。是否继续?(y/n)y 回溯(最近一次呼叫最后一次): 文件“/usr/bin/afflow”,第32行,在 args.func(args) 文件“/usr/lib/python2.7/site packages/afflow/utils/cli.py”,第74行,在包装器中 返回f(*args,**kwargs) 文件“/usr/lib/python2.7/site packages/afflow/bin/cli.py”,第258行,在delete_dag中 升高空气流量异常(err) airflow.Exception.AirflowException:服务器错误

虽然我可以通过Curl命令删除。 请让我知道,如果有人知道这个命令的执行,这是已知的还是我做错了什么


版本Airflow 1.10.1已经发布。此版本增加了从文件系统中删除相应DAG后从web UI中删除DAG的功能

有关更多详细信息,请参阅此票证:

[AIRFLOW-2657]添加从web ui删除DAG的功能


请注意,这实际上并没有从文件系统中删除DAG,您需要先手动执行此操作,否则DAG将被重新加载。

根据@OlegYamin的回答,我将执行以下操作以删除postgres支持的DAG,其中airflow使用
公共模式

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';

警告:我不知道第一次删除查询的效果/正确性。这只是假设需要它。

可以在Airflow 1.10中删除DAG-s,但操作过程和顺序必须正确。 有一个“鸡蛋和鸡的问题”-如果在文件仍然存在的情况下从前端删除DAG,则会重新加载DAG(因为文件未被删除)。如果先删除文件并刷新页面,则无法再从web gui中删除DAG。 因此,让我从前端删除DAG的操作顺序是:

  • 删除DAG文件(在我的例子中,从管道存储库中删除并部署到airflow服务器,特别是调度程序)
  • 不要刷新web GUI
  • 在dag视图(普通frontpage)的web GUI中,单击“删除dag”->最右侧的红色图标
  • 它将清除数据库中此DAG的所有剩余部分

  • 只需从mysql中删除,对我来说很好。从下表中删除它们:

    • 达格

    • dag_构造函数

    • 大邱集团船
    • 大邱泡菜
    • 达古跑
    • 达古统计
    (未来版本中可能会有更多表) 然后重新启动Web服务器和工作程序。

    首先--> 从$U HOME中删除DAG文件
    export SLUGIFY_USES_TEXT_UNIDECODE=yes
    
    export AIRFLOW_GPL_UNIDECODE=yes
    
    pip install -U apache-airflow
    
    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';
    
    \set dag_id YOUR_DAG_ID
    
    delete from xcom where dag_id=:'dag_id';
    delete from task_instance where dag_id=:'dag_id';
    delete from sla_miss where dag_id=:'dag_id';
    delete from log where dag_id=:'dag_id';
    delete from job where dag_id=:'dag_id';
    delete from dag_run where dag_id=:'dag_id';
    delete from dag where dag_id=:'dag_id';