Apache Airflow 每日午夜 UTC 时间表

Apache Airflow dag schedules in midnight UTC

我使用以下默认参数创建了 Apache Airflow DAG。我希望这个 DAG 在世界标准时间每天晚上 10 点 运行 但它总是在世界标准时间上午 12 点 运行 宁并忽略我在 start_date 中设置的日期时间。这不是正确的方法吗?谢谢

default_args = {
    'owner': config.OWNER,
    'depends_on_past': False,
    'start_date': datetime(2018, 10, 14, 22, 0, 0),
    'email': [config.ALERT_EMAIL],
    'email_on_failure': True,
    'email_on_retry': False,
    'retry_delay': timedelta(minutes=1),
    'retries': 2,
}

# DAG
dag = DAG('Test',
          default_args=default_args,
          description='Initial setup',
          schedule_interval='@daily')

您还可以在 schedule interval 参数中使用 cron format,如下所示:

# DAG
dag = DAG('Test',
          default_args=default_args,
          description='Initial setup',
          schedule_interval='0 22 * * *')

关于schedule_interval你至少有三个选择:

  • datetime.timedelta

  • dateutil.relativedelta

  • cron 样式字符串

schedule_interval 定义了 DAG 运行的频率。这个 timedelta 对象被添加到你最新的任务实例的 execution_date 来计算下一个时间表。请记住:start_date 对于任务,确定第一个任务实例的 execution_date。

以上都是正确的。

我遇到了一个问题,在 Airflow 2.0 中,schedule_interval 在 default_args 中被忽略。当我删除它并将其放入 DAG 声明时,一切正常。我可以通过查看 UI.

中的 DAG 详细信息来测试它

示例:

default_args = {
  'owner': 'Hector Hoffman',
  'depends_on_past': False,
  'start_date':start_date,
  'schedule_interval': '0 5 * * *',
  'email': ['hector@email.com'],
  'email_on_failure': True,
  'email_on_retry': False,
  'retries': 0,
  'on_failure_callback': task_fail_slack_alert
}

结果:

然而,当我把它放在 DAG 中时:

with models.DAG(
        "dealstampede_workflow",
        default_args=default_args,
        catchup=False,
        schedule_interval='0 5 * * *'
) as dag:

结果:

如果有人知道为什么 schedule_interval 在 default_args 中不起作用,我将不胜感激。谢谢