我已经启动了Airflow Web服务器并安排了一些工作。我可以在Web GUI上看到问题。
如何删除正在运行并显示在Web GUI中的特定DAG?是否有Airflow CLI命令可以执行此操作?
我环顾四周,但找不到DAG已加载和计划后删除DAG的简单方法的答案。
我已经启动了Airflow Web服务器并安排了一些工作。我可以在Web GUI上看到问题。
如何删除正在运行并显示在Web GUI中的特定DAG?是否有Airflow CLI命令可以执行此操作?
我环顾四周,但找不到DAG已加载和计划后删除DAG的简单方法的答案。
Answers:
编辑8/27/18-Airflow 1.10现在已在PyPI上发布!
https://pypi.org/project/apache-airflow/1.10.0/
我们现在在Airflow≥1.10中具有此功能!
PR #2199(Jira:AIRFLOW-1002)在Airflow中添加了DAG删除功能,现已合并,可以从所有相关表中完全删除DAG的条目。
现在,核心的delete_dag(...)代码已成为实验性API的一部分,并且可以通过CLI和REST API使用一些入口点。
CLI:
airflow delete_dag my_dag_id
REST API(在本地运行Web服务器):
curl -X "DELETE" http://127.0.0.1:8080/api/experimental/dags/my_dag_id
关于REST API的警告:确保您的Airflow群集在生产中使用身份验证。
要升级,请运行以下任一方法:
export SLUGIFY_USES_TEXT_UNIDECODE=yes
要么:
export AIRFLOW_GPL_UNIDECODE=yes
然后:
pip install -U apache-airflow
请记住首先检查UPDATING.md以获取全部详细信息!
airflow.exceptions.DagFileExists: Dag id example_bash_operator is still in DagBag. Remove the DAG file first
。
这是我使用的PostgresHook和默认的connection_id修改后的代码。
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)
task_fail
和添加dag_stats
不确定为什么Apache Airflow没有删除DAG的简便方法
我刚刚编写了一个脚本,该脚本删除了与特定dag相关的所有内容,但这仅适用于MySQL。如果使用PostgreSQL,则可以编写其他连接器方法。最初,这些命令由Lance在https://groups.google.com/forum/#!topic/airbnb_airflow/GVsNsUxPRC0上发布, 我只是将其放在脚本中。希望这可以帮助。格式: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)
dag
。delete from dag_pickle where id = (select pickle_id from public.dag where dag_id = 'my_dag_id')
从dag
表格中删除之前,我们还应该这样做吗?
Dag id example_bash_operator is still in DagBag. Remove the DAG file first.
。
Dag id example_bash_operator is still in DagBag. Remove the DAG file first.
从dags目录中删除DAG .py文件后,错误消失。
我编写了一个脚本,该脚本删除了与默认SQLite DB的特定dag相关的所有元数据。这是基于上述耶稣的回答,但从Postgres到SQLite。用户应该将../airflow.db
script.py的存储位置设置为相对于默认airflow.db文件(通常为~/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()
Airflow内置的功能不适合您。为了删除DAG,请从存储库中将其删除,并删除Airflow Metastore表-dag中的数据库条目。
您可以清除一组任务实例,就像它们从未一起运行一样:
airflow clear dag_id -s 2017-1-23 -e 2017-8-31
然后从dags文件夹中删除dag文件
dag
表中有一些未清除的数据
基于@OlegYamin的答案,我正在执行以下操作以删除由postgres支持的dag,其中airflow使用该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';
警告:我不知道第一个删除查询的效果/正确性。这只是一个需要的假设。
> = 1.10.0版本:
我的气流版本为1.10.2,尝试执行airflow delete_dag命令,但该命令引发以下错误:
bash-4.2#气流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:用户警告:psycopg2 wheel软件包将从2.8版本重命名;为了保持二进制安装,请改用“ pip install psycopg2-binary”。有关详细信息,请参见: http //initd.org/psycopg/docs/install.html#binary-install-from-pypi。继续?(y / n)y追溯(最近一次调用最近):文件“ / usr / bin / airflow”,第32行,位于args.func( args)文件“ /usr/lib/python2.7/site-packages/airflow/utils/cli.py”,第74行,在包装器中返回f(* args,** kwargs)文件“ / 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的引用。
您可以重置气流元数据库,将擦除所有数据,包括dag,但请记住,您还将擦除历史记录,池,变量等。
airflow resetdb
接着 airflow initdb
airflow resetdb
会擦除数据库中的所有内容,包括任何pools
,variables
甚至登录会话Cookie数据(这意味着在Server Error
刷新页面时在浏览器上具有登录会话Cookie的任何人都将获得,并且他们需要清除其cookie /缓存或使用Chrome的Incognitto模式以重新登录(在生产环境中有些不妥,因为它会使用户认为您的Airflow下降了...)。
airflow initdb
后运行airflow resetdb
。
首先->从$ AIRFLOW_HOME / dags文件夹中删除DAG文件。注意:根据是否使用了子目录,您可能必须在子目录中进行挖掘以找到DAG文件并将其删除。
第二个->使用删除按钮(x圈)从Web服务器UI删除DAG
对于可以直接访问psql
气流数据库的Postgres控制台的用户,您只需执行以下请求即可删除DAG:
\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';
类似的查询(稍有更改)适用于其他数据库,例如MySQL和SQLite。
从dags文件夹中删除dag(要删除)并运行airflow resetdb
。
或者,您可以进入airflow_db并从dag表中手动删除这些条目(task_fail,xcom,task_instance,sla_miss,log,job,dag_run,dag,dag_stats)。
airflow resetdb
会清除数据库中的所有内容,包括任何pools
、、variables
甚至登录会话Cookie数据(这意味着在浏览器中具有登录会话Cookie的任何人在刷新页面时都会收到服务器错误,并且需要清除其cookie /缓存或使用Chrome的Incognitto模式才能重新登录(这在生产环境中有些不利,因为它会使用户认为您的气流下降了……)。另外,您还必须在运行airflow initdb
后运行airflow resetdb
。
upgradedb
。
对于那些仍在寻找答案的人。在Airflow 1.8版上,删除DAG非常困难,您可以参考上面的答案。但是,由于1.9已发布,因此您只需要
删除dags文件夹上的dag并重新启动Webserver
resetdb
将消耗掉并重建整个元数据数据库。这样无法重置一个DAG。 airflow.apache.org/cli.html#resetdb