气流-仅当另一个DAG上的所有任务均成功执行时才运行DAG

时间:2020-08-20 15:52:25

标签: airflow

我是DAG,Airflow和Python语法的新手(我从Java中学到了编码),但是我有一个DAG,其中包含大约10个彼此独立的任务,并且我有另一个DAG,只有在所有10个任务中都可以运行任务很成功。由于我的掌握方式,如果一项任务失败,则DAG仍将运行其他任务,并且DAG被标记为成功。 (我想要的是什么)

是否有一种方法可以使新任务(任务11)通过其他任务并检查其状态?我找不到返回任务状态的函数

我在想类似的事情(假设有一个state()函数)

array_of_task_ids= [task1, task2, task3,...]
for i in array_of_tasks_ids
if array_of_task_id[i].state() == Failed 

#这意味着,如果发现状态为“失败”的任务,它将运行一个新的虚拟任务,指示其中一个任务失败了

 task_sensor_failed = DummyOperator(
 task_id='task_sensor_failed',
 dag=dag,
 )

然后在另一个只有在此任务“ task_sensor_failed”未运行的情况下才应运行的DAG上,我将传感器放在

external_sensor= ExternalTaskSensor(
task_id='external_sensor',
external_dag_id='10_tasks_dag',
external_task_id='task_sensor_failed',

... )

这不是我要使用的实际代码。我知道这是不对的,我只是想做一些简单的事情,以便您了解我正在尝试做的事情。我不知道,也许这是一种愚蠢的做法,但是就像我说的那样,我是新手,所以我不确定自己在做什么。

无论如何,总的想法是,如果另一个DAG的所有10个任务都成功了,那么我只能运行DAG,有人可以帮助我实现这一目标吗?对不起,很长的帖子,并感谢您的提前帮助! 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

一旦你知道

  • ExternalTaskSensor也可以感知整个{em> DAG (而不是task 中特定于DAG
  • 如果DAG中的任何一个leaf tasks失败,Airflow就会将其标记为失败(换句话说,只有当所有叶子任务都成功时,Airflow才会将DAG成功标记为一个

您可以执行此操作,而无需在第一个DAG中添加任何 dummy 任务


这里是

  1. 保持第一个DAG不变

  2. 使您的第二个DAG以{em>感知第一个DAG的ExternalTaskSensor开始(只需指定external_dag_id而不指定external_task_id

  • 如果其中一项任务失败,这将继续标记您的第一个DAG失败
  • 但如果第一个DAG的所有任务都成功(即第一个DAG成功),它仍将让第二个DAG运行

作为扩展,如果满足您的要求,则可以使您的第一个DAG 主动触发第二个DAG(仅当所有任务都成功完成时),如下所示

  1. 在您的第一个DAG中,

    • 使用TriggerDagRunOperator(默认)和{li>
    • 使其成为所有10个独立任务的下游upstream_tasks_list >> trigger_task
    • 让它触发第二个DAG trigger_dag_id='my_2nd_dag_id'
  2. 让您的第二个DAG保持不变