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