请说明Airflow在执行DAG任务时,针对任务失败与重试的默认行为和相关配置是如何运作的?
考察说明
考察对Airflow任务生命周期管理,特别是重试和失败处理机制的理解程度。
回答思路
- 【回答框架 1】Airflow通过任务实例(TaskInstance)的状态机管理执行过程,状态包括运行中、成功、失败、跳过、重试等。任务失败时,Airflow默认不会自动重试,除非配置了重试参数,例如在task定义中设置retries和retry_delay。
- 【回答框架 2】当任务失败且有剩余重试次数时,Airflow会更新任务实例状态为up_for_retry,在一段时间(由retry_delay指定,默认为60秒)后重新调度该任务实例。这个重试过程是在Airflow调度器的控制下进行的,不会重复执行同一任务实例,而是创建新的尝试(try_number增加)。
- 【回答框架 3】若超过最大重试次数仍失败,任务实例最终标记为失败(failed),并触发相关回调,如on_failure_callback。同时,默认情况下失败任务会导致整个DAG运行被标记为失败,除非配置了允许部分成功(如设置??)或者使用trigger规则改变依赖行为。
- 【回答框架 4】此外,Airflow还提供了其他重试控制选项,如max_active_runs限制并发DAG运行,depends_on_past可设置是否依赖上一次调度成功,以及任务级和DAG级的时间限制(execution_timeout, dagrun_timeout)来避免任务无限挂起。
- 【回答框架 5】对于失败处理,Airflow支持任务实例级别和DAG级别的告警以及重试日志记录,可用于监控和排查问题。
- 【关键点 1】重试由TaskInstance状态机控制,retries和retry_delay决定重试次数和间隔。
- 【关键点 2】重试是通过调度器重新调度up_for_retry状态的任务,try_number递增。
- 【关键点 3】失败次数超过retries后,任务标记为failed,可触发on_failure_callback。
- 【关键点 4】DAG运行失败行为受trigger规则和depends_on_past影响。
- 【关键点 5】通过execution_timeout和dagrun_timeout可限制运行时间。
- 【易错点 1】误以为Airflow默认自动重试所有失败任务,实际上需要显式配置retries。
- 【易错点 2】混淆task_retries与DAG级重试配置,需注意作用范围。
- 【易错点 3】忽略max_active_runs等限制可能导致重试密集时资源占用过高。