气流cron表达式计划不正确

时间:2020-07-11 15:28:20

标签: cron airflow

“开始日期”:datetime(2020,1,1),
time_zone ='亚洲/新加坡'

如果我希望每个星期三(SGT)00:55 AM生成报告,则应输入'55 0 * * 3',但必须输入'55 0 * * 4'。 (这样,执行时间将按预期的时间,每星期三00:55 SGT)

同样,如果我希望每个月第一天凌晨3点运行报告,我应该输入'schedule_interval ='0 3 1 * *',但是它将其安排到每月凌晨3点SGT。 / p>

发生了什么事?
我知道UTC时间早了8个小时,但这仍然无法解释,因为它们在SGT中的预期开始时间之前1天开始。 因此,对于以下内容(仅复制到相关部分中),DAG运行时都是SGT的星期三00:55。

from airflow.operators.email_operator import EmailOperator

from airflow.contrib.hooks.ssh_hook import SSHHook
from airflow.contrib.operators.ssh_operator import SSHOperator

from datetime import datetime, timedelta
from airflow import DAG
import pendulum


default_args = {
    'owner': 'fs',  # Change to your group name
    'depends_on_past': False,
    'retries': 3,
    'cathup': True,
    'start_date': datetime(2020, 1, 1),

    'retry_delay': timedelta(minutes=30),


# every Wednesday 0:55, so ga_flattening done for BR as well for Sunday
dag = DAG(
    dag_id='SOMETHING',
    default_args=default_args,
    max_active_runs = 10,  # max 10 DAGS running
    schedule_interval= '55 0 * * 4',  #this will be wednesday 00:55 AM, not sure why
    time_zone='Asia/Singapore',
    catchup=True)

1 个答案:

答案 0 :(得分:0)

摘自[docs] [1] ...

您可以尝试将非默认时区指定为DAG参数的一部分。但是,简化事情并在start_date插入时区可能更容易。

该建议建议通过使用start_date时区构建Python datetime,从而将时区信息添加到pendulum参数中。

import pendulum

local_tz = pendulum.timezone("Europe/Amsterdam")

default_args=dict(
    start_date=datetime(2016, 1, 1, tzinfo=local_tz),
    owner='Airflow'
)

dag = DAG('my_tz_dag', default_args=default_args)
op = DummyOperator(task_id='dummy', dag=dag)
print(dag.timezone) # <Timezone [Europe/Amsterdam]>

[1]:https://airflow.apache.org/docs/stable/timezone.html#:~:text=The%20default%20time%20zone%20is%20the%20time%20zone%20defined%20by,e.g.%60%60Europe%2FAmsterdam%60%60)。