我有一个气流任务管道,如图所示。 task1_error_handler
和task2_error_handler
是错误处理任务,仅当直接链接的任务失败时才应运行。我已经为这些任务设置了ONE_FAILED触发规则。但是似乎task1
上的错误会触发两个错误处理程序。我只需要触发task1_error_handler
。
所有任务都是自定义运算符,以status
结尾的任务ID是自定义传感器。
我应该如何实现呢?
答案 0 :(得分:1)
task1
上的错误导致两个错误处理程序都发生,因为task2
在task1
的下游,使task1
成为任务task2
的父级。
由于ONE_FAILED
和task1
的触发规则均为task2
,这会引起问题,因为ONE_FAILED
的定义是:
至少有一位父母失灵后立即解雇,它不会等待所有父母都做完
因此,您只希望task1_error_handler
失败时触发task1
。不幸的是,仅通过更改触发规则就无法轻松完成此操作,因为您无法像现在想要的那样直接链接条件任务。
您最好的选择是:
task2
的错误处理程序触发规则,而使用on_failure_callback
调用错误处理程序。答案 1 :(得分:0)
注意:建议的解决方案可能是错误的,但是您仍然会想到我正在尝试实现Logic Gates do in Digital Circuits,这可能会帮助您提出可行的解决方案。我鼓励您提供反馈意见
@Zack's answer很好地指出了问题所在。我只是想添加一个解决方法。
如果我们按如下所示创建一些新的虚拟任务和依赖项,则可能会成功。
一个DummyOperator
代替trigger_rule=ONE_FAILED
的{{1}}。它的成功意味着task2_error_handler
失败了(很可能是因为task2
的失败了)
task1
另一个带有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
最后在您的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_SUCCESS
在task2_retry_handler
失败时运行,但不能在task2_retry_handler
失败时运行。
task2
参考