气流错误处理任务触发规则,用于触发直接链接的任务失败

时间:2019-03-08 18:40:41

标签: airflow

我有一个气流任务管道,如图所示。 task1_error_handlertask2_error_handler是错误处理任务,仅当直接链接的任务失败时才应运行。我已经为这些任务设置了ONE_FAILED触发规则。但是似乎task1上的错误会触发两个错误处理程序。我只需要触发task1_error_handler。 所有任务都是自定义运算符,以status结尾的任务ID是自定义传感器。 我应该如何实现呢?enter image description here

2 个答案:

答案 0 :(得分:1)

task1上的错误导致两个错误处理程序都发生,因为task2task1的下游,使task1成为任务task2的父级。

由于ONE_FAILEDtask1的触发规则均为task2,这会引起问题,因为ONE_FAILED的定义是:

  

至少有一位父母失灵后立即解雇,它不会等待所有父母都做完

因此,您只希望task1_error_handler失败时触发task1。不幸的是,仅通过更改触发规则就无法轻松完成此操作,因为您无法像现在想要的那样直接链接条件任务。

您最好的选择是:

  • 保持task1不变,摆脱task2的错误处理程序触发规则,而使用on_failure_callback调用错误处理程序。
  • 将task2拆分为单独的DAG。

答案 1 :(得分:0)

注意:建议的解决方案可能是错误的,但是您仍然会想到我正在尝试实现Logic Gates do in Digital Circuits,这可能会帮助您提出可行的解决方案。我鼓励您提供反馈意见


@Zack's answer很好地指出了问题所在。我只是想添加一个解决方法。

如果我们按如下所示创建一些新的虚拟任务和依赖项,则可能会成功。

  1. 一个DummyOperator代替trigger_rule=ONE_FAILED的{​​{1}}。它的成功意味着task2_error_handler失败了(很可能是因为task2的失败了)

    task1
  2. 另一个带有from airflow.operators.dummy_operator import DummyOperator from airflow.utils.trigger_rule import TriggerRule .. task2_dummy_error_handler = DummyOperator( dag=my_dag, task_id="task2_dummy_error_handler", trigger_rule=TriggerRule.ONE_FAILED ) [task2, task2_status_check] >> task2_dummy_error_handler 的{​​{1}},用于通知DummyOperator是否成功。它的失败将意味着trigger_rule=ALL_SUCCESS已失败=> task1将由于task1而自动失败,因此我们无需运行task2

    UPSTREAM_FAILED
  3. 最后在您的task2_retry_handler中设置task1_error_handler_status_check = DummyOperator( dag=my_dag, task_id="task1_error_handler_status_check", trigger_rule=TriggerRule.ALL_SUCCESS ) [task1, task1_status_check] >> task1_error_handler_status_check ,并使其成为上述两个虚拟任务的下游。此应该确保trigger_rule=ALL_SUCCESStask2_retry_handler失败时运行,但不能在task2_retry_handler失败时运行。

    task2

参考