分支与触发规则是什么
分支解决「走哪条路」:BranchPythonOperator 或 @task.branch 返回下游 task_id,被选中的分支继续执行,未选中的分支被标记为 skipped。触发规则(trigger_rule)解决「上游处于什么状态才执行本任务」,默认 all_success。两者最容易出问题的地方是组合场景:上游一旦有 skipped,默认规则会把下游也跳过,包括本该无条件执行的收尾与告警任务。
基本信息
| 分支算子 | BranchPythonOperator、@task.branch(返回下游 task_id 或其列表) |
|---|---|
| 跳过语义 | 未选中的分支状态为 skipped,不是失败 |
| 常用触发规则 | all_success(默认)、all_done、all_failed、one_success、one_failed、none_failed、none_failed_min_one_success、always |
| 收尾任务 | 清理与通知类任务用 all_done,保证无论成败都执行 |
| 适用平台 | Apache Airflow 2.x(规则集合随版本略有扩充) |
典型使用场景
- 按数据量分流:全量分支与增量分支二选一执行
- 环境分流:生产走正式链路,测试走抽样链路
- 上游文件存在性判断:有文件走加载,无文件走告警分支
- 收尾清理:无论成功失败都要执行临时表清理,用 all_done
- 告警兜底:任一上游失败即发送告警,用 one_failed 或 all_done
- 多分支汇聚:汇聚后的下游须用 none_failed_min_one_success,否则被跳过
分支与收尾示意
分支与收尾示意
from airflow.operators.python import BranchPythonOperator
from airflow.utils.trigger_rule import TriggerRule
choose = BranchPythonOperator(task_id="choose", python_callable=pick_route)
# pick_route 返回 "full" 或 "incr",未选中的分支变为 skipped
full = PythonOperator(task_id="full", python_callable=full_load)
incr = PythonOperator(task_id="incr", python_callable=incr_load)
# 收尾清理不受分支跳过影响,必须用 all_done
clean = PythonOperator(task_id="clean", python_callable=clean_tmp,
trigger_rule=TriggerRule.ALL_DONE)
choose >> [full, incr] >> clean触发规则选择
| 规则 | 何时执行 | 典型用途 |
|---|---|---|
| all_success | 所有上游成功 | 默认,普通串联任务 |
| all_done | 所有上游结束(不论状态) | 清理临时表、发汇总通知 |
| one_failed | 任一上游失败即执行 | 失败告警 |
| none_failed | 没有失败即执行(允许 skipped) | 分支汇聚后的下游 |
| none_failed_min_one_success | 无失败且至少一个成功 | 多分支汇聚汇总任务 |
| always | 无条件执行 | 审计留痕类任务 |
默认规则是 all_success:上游存在 skipped 时下游同样被跳过。多条分支汇聚时用 none_failed_min_one_success,收尾任务用 all_done,是最常见的两处修正。
用 all_success 做告警任务,恰好在上游失败时不触发,告警形同虚设:失败通知类任务应使用 all_done 或 one_failed。