【问题标题】:Run DAG at specific time each day每天在特定时间运行 DAG
【发布时间】:2021-06-24 09:50:28
【问题描述】:

我也多次阅读了有关schedule_intervalstart_date 和 Airflow 文档的多个示例,但我仍然无法理解:

如何在每天的特定时间执行我的 DAG?例如,假设现在是上午 9:30(上午),我部署了我的 DAG,我希望它在 10:30 执行

我试过了


with DAG(
    "test",
    default_args=default_args,
    description= "test",
    schedule_interval = "0 10 * * *",
    start_date = days_ago(0),
    tags = ["goodie"]) as dag:

但由于某种原因,今天没有运行。我尝试了不同的start_dates altso start_date = datetime.datetime(2021,6,23),但它没有被执行。

如果我将days_ago(0) 替换为days_ago(1),它会一直落后1 天,即它今天没有运行,但昨天运行了

难道没有一种简单的方法可以说“我现在部署我的 DAG,我想用这个 cron 语法执行它”(我认为这是大多数人想要的)而不是计算执行时间,基于在start_dateschedule_interval 上并弄清楚,如何解释它?

【问题讨论】:

    标签: airflow airflow-scheduler


    【解决方案1】:

    如果我将 days_ago(0) 替换为 days_ago(1),它总是落后 1 天

    它不落后。您只是将 Airflow 调度机制与 cron 作业混淆了。在 cron 作业中,您只需提供一个 cron 表达式并相应地安排 - 这不是它在 Airflow 中的工作方式。

    在 Airflow 中,调度由 start_date + schedule interval 计算。 Airflow 在间隔结束时执行作业。这与数据管道通常的工作方式是一致的。今天您正在处理昨天的数据,所以在这一天结束时您想要启动一个处理昨天记录的流程。

    作为一项规则 - 永远不要使用动态开始日期。

    设置:

    with DAG(
        "test",
        default_args=default_args,
        description= "test",
        schedule_interval = "0 10 * * *",
        start_date = datetime(2021,06,23, 10 ,0), # 2021-06-23 10:00
        tags = ["goodie"]) as dag:
    

    意味着第一个将在2021-06-24 10:00 开始,这次运行execution_date 将是2021-06-23 10:00。第二次运行将在2021-06-25 10:00 开始,这次运行execution_date 将是2021-06-24 10:00

    由于这对许多新用户来说是一个困惑的根源,因此 AIP-39 Richer scheduler_interval 正在进行架构更改,这将在运行时间和运行时要考虑的间隔之间解耦 - 但正如提到的那样,这尚未最终确定。

    【讨论】:

    • 澄清一下——execution_date2021-06-23 是什么意思?这是否意味着它将运行 23 日或..?既然如此,23号怎么会触发24号呢?
    • execution_date 可以用作宏。例如,在 SQL 语句中,您可以执行以下操作:WHERE date_column is between {{ execution_date }} and {{ next_execution_date }} 如果您的管道实际上并不关心处理日期之间的数据,而您正在寻找的只是执行某些操作(例如将整个表复制到另一个数据库),那么它不会真的不关心你。
    • 我想要的只是以下内容:今天是 6 月 24 日 13:15。我部署了一个 DAG,我希望它每天在 1330 运行。我设置了 schedule_interval = "30 13 * * *,如果我理解你,我可以将 start_date 设置为 1330 年 23 日之前的任何时间,例如 datetime(2021,23,6,13,0,0) 或者必须是datetime(2021,23,6,13,30)?
    • schedule_interval 是一个crontab-syntax 时,我想我很难看到你如何计算start_date +schedule_interval
    • 您的 crontab 实际上只是在 24 小时内说一次。只需:start_date=datetime(2021,23,6,13,30) schedule_interval = "30 13 * * *" 请注意,如果您运行的是旧版 Airflow,您可能需要更改 dag_id
    猜你喜欢
    • 2020-08-28
    • 2021-01-04
    • 2013-04-18
    • 2016-06-05
    • 2020-11-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多