Airflow中能否设置多阶retry_delay?需新增12小时二次重试
解决Airflow DAG多间隔重试的问题
可以实现,但原生的retry_delay不支持直接传入多个值列表,不过你可以通过自定义可调用函数精确控制每次重试的间隔,或者结合指数退避参数近似实现。下面是两种可行方案:
方案1:自定义重试延迟函数(精确匹配需求)
将retry_delay设置为一个接收当前重试次数(try_number)的函数,根据重试次数返回对应的延迟时长。同时记得把retries改为2(对应两次重试:第一次10分钟,第二次12小时)。
修改后的代码示例:
from datetime import timedelta def custom_retry_delay(try_number): # try_number从1开始计数,第一次重试对应try_number=1 if try_number == 1: return timedelta(minutes=10) elif try_number == 2: return timedelta(hours=12) # 若设置更多重试次数,可自定义默认延迟 return timedelta(hours=24) globals()[name] = dag = DAG( dag_id=name, tags=tags, default_args={ 'email_on_failure': True, 'retries': 2, # 调整为2次重试 'retry_delay': custom_retry_delay # 绑定自定义延迟函数 }, catchup=False, schedule_interval=schedule_interval, start_date=DEFAULT_START_DATE.replace(tzinfo=timezone), )
方案2:使用指数退避(近似实现)
如果可以接受非精确的间隔,Airflow支持retry_exponential_backoff参数,开启后重试间隔会按指数增长。你可以通过调整参数接近需求,但这种方式无法严格匹配10分钟+12小时的组合,仅作备选:
globals()[name] = dag = DAG( dag_id=name, tags=tags, default_args={ 'email_on_failure': True, 'retries': 2, 'retry_delay': timedelta(minutes=10), 'retry_exponential_backoff': True, # 开启指数退避 'max_retry_delay': timedelta(hours=12) # 限制最大重试延迟 }, catchup=False, schedule_interval=schedule_interval, start_date=DEFAULT_START_DATE.replace(tzinfo=timezone), )
注意事项
try_number从1开始计数,第一次重试对应try_number=1,第二次对应try_number=2。- 自定义延迟函数需要Airflow 1.10.10及以上版本支持。
内容的提问来源于stack exchange,提问作者TwanK
相关产品推荐
相关产品推荐

