Airflow调度间隔异常:新DAG仍显示1天周期问题排查
我需要将DAG的运行时间改为中午。按照相关建议删除原DAG后,上传了重命名且修改了dag_id的新版本——原文件从dag_1.py改为new_dag_1.py,dag_id已变更,schedule_interval从@daily改为0 12 * * *,但上传后该DAG在首页的调度仍显示1 day, 0:00:00。我上传了参数相同的全新DAG,其调度间隔正确显示为0 12 * * *,说明修改后的DAG或元数据存在问题,导致Airflow未将其识别为新DAG。除了文件名和dag_id,我还需修改哪些内容才能让Airflow生效新的调度时间?
编辑:我用通用代码复现了该问题:
第一个版本dag_1.py代码:
import airflow import datetime import logging from airflow.utils.task_group import TaskGroup from airflow.operators.dummy import DummyOperator YESTERDAY = datetime.datetime.now() - datetime.timedelta(days=1) default_args = { 'owner': 'my_name', 'depends_on_past': False, 'email': ['my_email'], 'email_on_failure': False, 'email_on_retry': False, 'retries': 0 , 'slack_conn_id': 'slack_conn', 'start_date': YESTERDAY, 'project_id': 'my_project', 'dataset_id': 'my_dataset', 'schedule_interval': '@daily', } with airflow.DAG( 'test_cron', catchup=False, default_args=default_args, tags=['example'] ) as dag: my_empty_operator = DummyOperator( task_id='empty_task', dag=dag, ) my_empty_operator
更新版本dag_1_2.py代码:
import airflow import datetime import logging from airflow.utils.task_group import TaskGroup from airflow.operators.dummy import DummyOperator YESTERDAY = datetime.datetime.now() - datetime.timedelta(days=1) default_args = { 'owner': 'my_name', 'depends_on_past': False, 'email': ['my_email'], 'email_on_failure': False, 'email_on_retry': False, 'retries': 0 , 'slack_conn_id': 'slack_conn', 'start_date': YESTERDAY, 'project_id': 'my_project', 'dataset_id': 'my_dataset', 'schedule_interval': '0 12 * * *', } with airflow.DAG( 'test_cron_2', catchup=False, default_args=default_args, tags=['example'] ) as dag: my_empty_operator = DummyOperator( task_id='empty_task', dag=dag, ) my_empty_operator
我已修改:1.文件名;2.dag_id;3.schedule_interval,但新DAG dag_1_2.py在UI上仍显示调度为1 day, 0:00:00,这是怎么回事?从各方面看这应该是个新DAG才对?
核心问题:动态生成start_date导致元数据混淆
你代码里的YESTERDAY = datetime.datetime.now() - datetime.timedelta(days=1)是动态计算的,每次Airflow解析DAG文件时,这个值都会变化。当你上传新DAG时,动态生成的start_date可能触发元数据缓存或关联问题,导致Airflow误判调度间隔。Airflow官方要求start_date必须是固定值,动态日期会让DAG每次解析都被视为“新变更”,进而引发元数据混乱。
具体修复步骤
- 替换动态
start_date为固定日期
把YESTERDAY改成固定的datetime对象,比如:YESTERDAY = datetime.datetime(2024, 5, 20) # 替换为你实际需要的起始日期 - 刷新Airflow DAG解析
执行以下命令强制刷新DAG元数据:
如果使用CeleryExecutor,重启worker进程确保新DAG定义被加载。airflow dags refresh airflow dags list - 强化新DAG的独立性
临时修改owner字段或添加新的tags,比如把tags=['example']改成tags=['example', 'new_version'],避免Airflow因其他共性参数误关联旧DAG。
验证方法
修改start_date为固定值后重新上传文件,等待1-2分钟让Airflow完成解析,再检查UI上的调度间隔,应该会正确显示为0 12 * * *。
内容的提问来源于stack exchange,提问作者CClarke

