气流:避免任务状态=跳过

时间:2017-05-18 13:14:50

标签: python apache triggers conditional-statements airflow

我想在Airflow中创建一个条件任务,如下面的架构所述。预期的情况如下:

  • 任务1:Start_cluster执行
  • 如果任务1成功,则任务2执行
  • 如果任务2成功,则执行任务3
  • 如果所有任务都成功或一个任务失败,则执行任务4:terminate_cluster

enter image description here

我试过了:

trigger_rule=TriggerRule.ONE_FAILED

任务4保持跳过状态,all_done也

trigger_rule=TriggerRule.ALL_DONE

我认为这个解决方案:How to create a conditional task in Airflow但它对我不起作用。

1 个答案:

答案 0 :(得分:2)

我认为无论先前的任务是否成功,您都希望终止群集,因此ALL_DONE听起来合适。除了Start_Cluster。如果失败,则可能没有终止群集,尽管您可能需要检查/尝试以防万一。

默认的trigger_rule是ALL_SUCCESS,因此,例如,如果任务1失败,整个Dag将失败,因为任务2要求任务1成功才能运行。

如果任何任务可能失败,但您仍想终止群集,则需要一些备用途径来跟随dag,例如:使用PythonBranchOperator和Python回调函数。

另一种可能性是使用一个以“ONE_FAILURE”的trigger_rule运行的虚拟运算符,然后运行Terminate Cluster任务。

例如,如果您将虚拟任务命名为“Task_Failure”,则这将是依赖关系链:

Start_Cluster >> Task_2 >> Task_3 >> Terminate_Cluster
Task_2 >> Task_Failure
Task_3 >> Task_Failure
Task_Failure >> Terminate_Cluster

在这种情况下,Task_Failure可能必须将Terminate_Cluster trigger_rule设置为ONE_SUCCESS,因为某些任务可能永远不会运行。如果您已将最终任务设置为ALL_DONE以及之前的一些任务没有状态,它可能只是挂起或可能失败。

ALL_DONE和ALL_SUCCESS之间的区别:https://stackoverflow.com/a/47716981/1335793