首页/数据/数据工程与 ETL 速查/任务超时与完成时限控制

任务超时与完成时限控制

任务超时控制有两层:单个任务执行超时(execution_timeout)、整个调度批次用时上限(dagrun_timeout);再配合“产出新鲜度”监控,才覆盖按时产出这个目标。

任务超时的两层控制

任务超时至少有两层控制:单任务执行超时(execution_timeout)限制一个任务最多跑多久,超时会被终止;批次超时(dagrun_timeout)限制一次 DagRun 的总时长。再往上还有一层「产出新鲜度」监控——盯目标表或分区的最晚就绪时间。前两层是执行侧约束,第三层才真正回答「今天的数是否按时可用」这个业务问题。

基本信息

任务级execution_timeout:单任务最长执行时间,超时被终止
批次级dagrun_timeout:整个 DagRun 的最长运行时间
产出级监控目标表或分区的最晚就绪时间
重跑前提任务需支持分区覆盖或 upsert,超时后才能安全重跑

典型使用场景

  • 长跑任务防卡死:给重任务设执行超时,避免长期占用槽位
  • 日切批次兜底:给关键链路设 DagRun 总时长上限
  • 月末大批次:按历史峰值耗时评估超时值,避免误杀
  • 产出承诺:与合作方约定产出时间并监控就绪状态
  • 故障恢复:超时后按策略重试或转人工,保证当天数据补齐

Airflow 超时设置

Airflow 超时设置
from datetime import timedelta

task = BashOperator(
    task_id='load_dwd',
    bash_command='spark-submit /opt/jobs/dwd.py',
    execution_timeout=timedelta(hours=1),   # 单任务最长 1 小时,超时终止
    retries=2,                              # 超时终止后按重试策略再跑一次
    retry_delay=timedelta(minutes=5),
    dag=dag,
)
# 批次级:DAG(..., dagrun_timeout=timedelta(hours=6)) 限制整批总时长

超时层次与做法

层次控制对象不控制的后果
任务级 execution_timeout单个任务实例任务卡死长期占用槽位
批次级 dagrun_timeout一次 DagRun批次挂住不结束,需人工发现
产出级新鲜度监控目标分区就绪时间漏掉「成功但没数据」的情况
超时终止后要能安全重跑:确认任务使用分区覆盖或 upsert 写目标表,否则超时留下的半成品会和重跑结果混在一起,产生重复或残缺。
超时时间设得过短,正常的大批次(月末、大促补数)会被误杀并触发重试风暴,反而更慢;应按历史峰值耗时留出余量再定阈值。

易错点

  • 没有超时设置的任务卡死后会一直占用执行槽位,拖垮后续整条调度链
  • 超时阈值按平均耗时设置,月末大批次被误杀,反复重试比一次跑完更慢
  • 只设执行超时不监控产出时间,任务显示成功但数据晚了几小时,下游照旧延误
  • 超时任务已写出半成品就直接重跑,目标表出现重复或残缺数据

数据来源与参考

  • Apache Airflow 官方文档:execution_timeout 与 dagrun_timeout
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌