You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Airflow调度间隔异常:新DAG仍显示1天周期问题排查

问题:Airflow新DAG调度间隔未正确显示的排查与解决

我需要将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元数据:
    airflow dags refresh
    airflow dags list
    
    如果使用CeleryExecutor,重启worker进程确保新DAG定义被加载。
  • 强化新DAG的独立性
    临时修改owner字段或添加新的tags,比如把tags=['example']改成tags=['example', 'new_version'],避免Airflow因其他共性参数误关联旧DAG。

验证方法

修改start_date为固定值后重新上传文件,等待1-2分钟让Airflow完成解析,再检查UI上的调度间隔,应该会正确显示为0 12 * * *。

内容的提问来源于stack exchange,提问作者CClarke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:27:07