气流:如何删除DAG?


74

我已经启动了Airflow Web服务器并安排了一些工作。我可以在Web GUI上看到问题。

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

我环顾四周,但找不到DAG已加载和计划后删除DAG的简单方法的答案。


没有为此的CLI。但是,如果您想尝试恢复请求,则会有一个请求被放弃:github.com/apache/incubator-airflow/pull/1344
TheF1rstPancake

1
在<1.10的Airflow版本中,它分为两个步骤:1.从/ airflow / dags /文件夹中删除Dag这将从airflow list_dags命令中删除dag。但是它仍然会在GUI上显示并显示一条消息,因为其状态为活动状态,因此会在Airflow GUI上显示。为了删除它,请遵循以下步骤:2)转到airflow集群的mysql实例,并查找数据库名称“ airflow”。在该表中搜索表名称“ dag”。运行describe命令,它将显示一个字段名称,“ is_active”设置为1。运行mysql update命令并将其设置为0。现在刷新GUI,并且dag不存在。
Neha0908 '19

Answers:


66

编辑8/27/18-Airflow 1.10现在已在PyPI上发布!

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


如何完全删除DAG

我们现在在Airflow≥1.10中具有此功能!

PR #2199(Jira:AIRFLOW-1002)在Airflow中添加了DAG删除功能,现已合并,可以从所有相关表中完全删除DAG的条目。

现在,核心的delete_dag(...)代码已成为实验性API的一部分,并且可以通过CLIREST 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群集在生产中使用身份验证

安装/升级到Airflow 1.10(当前)

要升级,请运行以下任一方法:

export SLUGIFY_USES_TEXT_UNIDECODE=yes

要么:

export AIRFLOW_GPL_UNIDECODE=yes

然后:

pip install -U apache-airflow

请记住首先检查UPDATING.md以获取全部详细信息!


1
@Mike好抓住。修复它。谢谢!
泰勒·埃德米斯顿'18

2
气流1.10.1如今又加上从Web UI删除DAG的能力
亚历克斯

2
这给了我airflow.exceptions.DagFileExists: Dag id example_bash_operator is still in DagBag. Remove the DAG file first
akki

1
@akki通过API或UI删除DAG仅会从数据库表中删除DAG的历史记录,而不是DAG文件本身,因此,如果您的目标是不要再次运行DAG,则最好先删除DAG的.py文件。
泰勒·埃德米斯顿,

1
@akki是的,示例DAG很奇怪,因为它们是内置的。在你airflow.cfg下的配置文件[core]组,我会建议设置load_examples,以False用于生产实例。这相当于删除示例的DAG文件。 更多信息
泰勒·埃德米斯顿,

20

这是我使用的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)

4
我认为您也可以在该列表中添加task_fail和添加dag_stats
marengaz

1
即使运行此程序,我仍然在UI中看到dag。当我单击它时,它说dag丢失了。有没有办法从用户界面中删除它?
Gaurang Shah


11

我刚刚编写了一个脚本,该脚本删除了与特定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)

我注意到表中有一个pickle_id dagdelete from dag_pickle where id = (select pickle_id from public.dag where dag_id = 'my_dag_id')dag表格中删除之前,我们还应该这样做吗?
安德烈·C·安徒生

10

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

  1. 删除DAG文件(在我的情况下,从管道存储库中删除并部署到气流服务器,尤其是调度程序)
  2. 不要刷新Web GUI。
  3. 在DAGs视图(常规首页)的Web GUI中,单击“删除数据”->在此处输入图片说明最右边的红色图标。
  4. 它将从数据库中清除该DAG的所有剩余内容。

您发现了序列。你救了我。
Ganesh

6

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

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

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

带有“删除”图标的“气流链接”菜单

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


如果您删除了实际的DAG文件,则可以使用。如果DAG仍然存在,它将被重新加载
亚历

2
这给了我Dag id example_bash_operator is still in DagBag. Remove the DAG file first.
akki

1
您需要首先从文件系统中删除Dag文件。
亚历克斯

@Jaco的评论很有帮助。Dag id example_bash_operator is still in DagBag. Remove the DAG file first.从dags目录中删除DAG .py文件后,错误消失。
托马什Záluský

这是一个非常有用的功能!但是,我想删除DAG,以便仅删除历史记录并立即重新添加它。Airflow不接受具有相同文件名的DAG。我必须更改DAG的文件名,然后Airflow将其识别为新的DAG(具有相同的名称和相同的参数)。
peschü

5

我编写了一个脚本,该脚本删除了与默认SQLite DB的特定dag相关的所有元数据。这是基于上述耶稣的回答,但从Postgres到SQLite。用户应该将../airflow.dbscript.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()

这行之有效,并且至少是在PR合并之前是一个很好的解决方案
Nigel Ng

1

Airflow内置的功能不适合您。为了删除DAG,请从存储库中将其删除,并删除Airflow Metastore表-dag中的数据库条目。


我还必须重新启动运行计划和Web服务器的计算机以完成清理。仅重新启动Web服务器和调度程序是不够的。
Jean-Christophe Rodrigue

1

您可以清除一组任务实例,就像它们从未一起运行一样:

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

然后从dags文件夹中删除dag文件


1
这可能会导致dag表中有一些未清除的数据
Chengzhi

如果要删除作为重置dag的方法,它也可能导致气流决定是重新运行DAG的时候了
Adam Bethke,

0

基于@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';

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


0

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

  • g

  • dag_constructor

  • dag_group_ship
  • dag_pickle
  • dag_run
  • dag_stats

(在将来的版本中可能会有更多表),然后重新启动Webserver和worker。


0

> = 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


1
是的,但是您应该让人们知道运行airflow resetdb会擦除数据库中的所有内容,包括任何poolsvariables甚至登录会话Cookie数据(这意味着在Server Error刷新页面时在浏览器上具有登录会话Cookie的任何人都将获得,并且他们需要清除其cookie /缓存或使用Chrome的Incognitto模式以重新登录(在生产环境中有些不妥,因为它会使用户认为您的Airflow下降了...)。
凯尔·布​​莱恩汀汀

另外,您还必须在运行airflow initdb后运行airflow resetdb
凯尔·布​​莱恩汀汀

0

首先->从$ AIRFLOW_HOME / dags文件夹中删除DAG文件。注意:根据是否使用了子目录,您可能必须在子目录中进行挖掘以找到DAG文件并将其删除。

第二个->使用删除按钮(x圈)从Web服务器UI删除DAG


0

对于可以直接访问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。


0

在新的气流版本中,UI中的DAG旁边有一个删除dag(红色x)按钮。

在此处输入图片说明


-2

从dags文件夹中删除dag(要删除)并运行airflow resetdb

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


2
是的,但是您应该让人们知道运行airflow resetdb会清除数据库中的所有内容,包括任何pools、、variables甚至登录会话Cookie数据(这意味着在浏览器中具有登录会话Cookie的任何人在刷新页面时都会收到服务器错误,并且需要清除其cookie /缓存或使用Chrome的Incognitto模式才能重新登录(这在生产环境中有些不利,因为它会使用户认为您的气流下降了……)。另外,您还必须在运行airflow initdb后运行airflow resetdb
凯尔·布​​莱登斯汀

不建议。要更新数据库数据,请首选upgradedb
塞巴斯蒂安·帕尔玛

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.