如何取消暂停Airflow DAG且不立即触发执行?
解决DAG取消暂停后立即执行的问题
方法1:设置catchup=False
这是最直接的解决方案,在DAG定义中添加catchup=False,可阻止Airflow在DAG转为未暂停状态时,补跑之前错过的调度周期,仅按未来的调度时间执行任务。
如果使用Dag Factory,可在配置文件中给目标DAG添加该参数:
dag_factory_config: dags: 你的DAG名称: catchup: False schedule_interval: "@daily" # 其他DAG配置项
方法2:手动创建DagRun标记已处理周期
若需更精细控制,或不想修改DAG定义,可在激活DAG前手动创建DagRun记录,标记最近一次调度周期已处理,让Airflow不会触发立即执行。
示例Python代码(可通过Airflow CLI或脚本执行):
from airflow.models import DagRun, DAG from airflow.utils.session import create_session from datetime import datetime dag_id = "你的DAG名称" dag = DAG.get_dag(dag_id) # 计算最近一次应调度的时间(当前时间前的一个调度周期) last_scheduled_date = dag.previous_schedule(datetime.now()) with create_session() as session: # 检查是否已存在对应周期的DagRun existing_run = session.query(DagRun).filter( DagRun.dag_id == dag_id, DagRun.execution_date == last_scheduled_date ).first() if not existing_run: # 创建状态为success的DagRun,标记该周期已处理 dag_run = DagRun( dag_id=dag_id, execution_date=last_scheduled_date, start_date=datetime.now(), state="success" ) session.add(dag_run) session.commit() # 取消DAG暂停状态 dag.set_is_paused(is_paused=False)
方法3:全局禁用默认补跑(谨慎使用)
若要全局控制所有新DAG的行为,可修改airflow.cfg中的catchup_by_default参数为False,这样所有新创建的DAG默认会开启catchup=False。但此为全局设置,可能影响其他业务DAG,需谨慎操作:
[core] catchup_by_default = False
关于is_active=False无效的说明
is_active与DAG的暂停状态(is_paused)是独立的两个配置:is_active用于控制DAG是否被调度器识别,而你需要的是取消暂停后不立即执行,因此修改该参数无法解决问题。
内容的提问来源于stack exchange,提问作者Dzaytsev
相关产品推荐
相关产品推荐

