Airflow的NONE_FAILED_MIN_ONE_SUCCESS触发规则未按预期工作
问题描述
我有一个Airflow DAG:Branch Operator执行成功,选中了以create tables开头的分支,但create tables任务执行失败。我的Update_watermarks任务设置了none_failed_min_one_success触发规则,按照文档定义它应该不会被触发,但实际却执行了。
尝试改用none_failed规则时,该任务依然被允许执行,同样不符合文档定义。
使用all_success规则能满足部分需求,但当分支被跳过的情况下,Update_watermarks不会执行,不符合我的预期。
我的理想执行逻辑是:
- 若Branch Operator或分支内任务失败,
Update_watermarks不应运行; - 若Branch Operator和分支内任务均成功,
Update_watermarks应运行; - 若Branch Operator成功但分支任务被跳过,
Update_watermarks仍应运行。
参考Airflow官方文档中触发规则的定义:
none_failed_min_one_success: All upstream tasks have not failed or upstream_failed, and at least one upstream task has succeeded.
none_failed: All upstream tasks have not failed or upstream_failed - that is, all upstream tasks have succeeded or been skipped.
原因分析
问题核心在于上游任务范围的配置,以及Airflow分支任务的状态传递逻辑:
- 上游任务范围错误:如果
Update_watermarks的上游仅设置为Branch Operator,而非包含分支内的create tables任务,那么即使分支任务失败,触发规则只会检查Branch Operator的状态(success),自然会满足none_failed_min_one_success和none_failed的条件,导致任务被触发。 - 版本Bug可能性:若已正确配置上游包含分支任务,但问题仍存在,可能是Airflow旧版本中对分支任务状态的处理存在Bug,部分旧版本会错误忽略分支内失败任务对触发规则的影响。
解决方案
要实现你的理想逻辑,按以下步骤调整:
修正上游任务配置:
确保Update_watermarks的上游包含Branch Operator和所有分支任务,这样分支内任务的失败状态会被纳入触发规则的判断范围。使用
none_failed_min_one_success触发规则:
该规则完全匹配你的需求:- 当Branch Operator或分支任务失败时,存在
failed状态的上游,规则不满足,Update_watermarks不执行; - 当Branch Operator和分支任务均成功时,所有上游无失败且至少一个成功,规则满足,任务执行;
- 当Branch Operator成功但分支任务被跳过,所有上游状态为
success或skipped,且至少有一个成功(Branch Operator),规则满足,任务执行。
- 当Branch Operator或分支任务失败时,存在
若调整后问题仍存在,建议:
- 检查任务的
trigger_rule参数是否正确配置; - 在Airflow UI中查看
Update_watermarks的上游任务状态详情,确认每个上游的状态是否符合预期; - 升级Airflow到2.x系列的稳定版本,修复可能存在的旧版本Bug。
内容的提问来源于stack exchange,提问作者Raj Rao

