python - Airflow cron 计划间隔不触发 DAG

标签 python cron airflow directed-acyclic-graphs

注意:crontab.guru 链接已损坏,因此我将它们包装在代码块中。

我有一个 DAG,将在太平洋时间周一午夜(世界标准时间)上午 8 点执行,延迟 1 分钟以避免任何重叠问题。

最初计划间隔设置为1 8 */1 * 1,根据https://crontab.guru/#1_8_*/1_*_1是“如果是星期一,则每月每一天的 08:01 UTC(03:01 EST,00:01 PST)。

但是,这导致 DAG 在每天 08:01 UTC 触发;周一的情况似乎被忽略了。

计划间隔已更新为更简单的 1 8 * * 1,根据 https://crontab.guru/#1_8_*_*_1 为“周一 08:01 UTC(03:01 EST,00:01 PST)”。

这会阻止 DAG 每天执行,但它并未在 2019 年 2 月 18 日(更新后的第一个星期一)触发。我读过一些其他帖子,表明开始日期可能会导致此问题,但此任务的开始日期是 datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC),这是 2019-02-18 运行日期之前的两个间隔。

这是完整的 DAG/任务定义(没有导入或特定名称):

dag = DAG(
    dag_id="dag",
    description="dag",
    # At 08:01 UTC (03:01 EST, 00:01 PST) on Monday
    # (https://crontab.guru/#1_8_*_*_1)
    schedule_interval="1 8 * * 1",
    catchup=False,
)


task = PythonOperator(
    task_id="handle",
    provide_context=True,
    python_callable=handle,
    dag=dag,
    retries=2,
    retry_delay=timedelta(minutes=15),
    start_date=datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC),
)

知道为什么这不会在 2019-02-18 00:01 UTC 时间间隔之后执行吗?

最佳答案

编辑: 您没有看到 18 号运行执行的原因是您有 catchup=False

这将导致 DAG 跳过回填天(如果回填天已经过去)。如果您想看到 DAG 填充第 17 和 24 个,则需要设置 catchup=True

Airflow DAG 在计划间隔END执行,因此,如果您的开始日期是当前星期一并且间隔是每周一,则 DAG 将不会执行本周一持续到下周一。

这里的主要思想是,当前周一运行的数据现在可用,直到该间隔期结束。这让你从日常工作的角度思考它更有意义。如果您运行的作业正在查找今天的数据,那么该数据集要到今天结束时才会完整。因此,如果您想运行今天的数据,则需要明天执行您的作业。不管你喜欢与否,这只是 Airflow 所采用的约定。

如果您想调整日期,可以使用 {{ Macros.ds_add( ds, 7) }} 将执行日期移动 7 天。

请告诉我这个答案是否有意义。如果没有,我会扩展它。这个约定是我们在开发 Airflow 作业时必须处理的最烦人的细节。

关于python - Airflow cron 计划间隔不触发 DAG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830586/

相关文章:

python - 使用 Python、Pika 和 AMQP 设计异步 RPC 应用程序的最佳模式是什么?

python - 从 Pandas 中的单个字符串列创建新的二进制列

linux - 在 suse linux 中远程启用和禁用 cronjob

airflow - 无法在 Airflow 中部署 DAG

git - 在 Pod 中使用 Airflow 设置 Git-Sync 时出现问题

airflow - 如何在 Airflow 中使用默认变量

python - Pandas 对字符串的列过滤给出了意想不到的结果

python - 在 PyCharm 中重命名文件

cron - 徽章成就系统如 SO : Data being used + Criteria(instant awarding & cron jobs)

php - PHP 脚本可以安排在特定时间或特定时间过后运行吗?