如何在当地时间午夜而不是午夜UTC时间触发每日DAG

Mar*_*eni 7 airflow apache-airflow airflow-scheduler

我在UTC + 4时区,所以当Airflow触发夜间ETL时,它已经是凌晨4点了.如何告诉Airflow在20:00的ds-1日触发日ds的运行,但ds = ds?

根据文档,强烈建议将所有服务器保留在UTC上,这就是我正在寻找应用程序级解决方案的原因.

编辑:一个hacky解决方案是定义它每天晚上20:00运行,所以"前一天",但然后使用tomorrow_ds而不是ds在工作中.但是在Airflow UI上看起来仍然很奇怪,因为这将显示UTC执行时间.

Ash*_*lor 9

调度间隔也可以是"cron表达式",这意味着您可以在20:00 UTC轻松运行它.加上"user_defined_filters"意味着你可以通过一些技巧获得你想要的行为:

from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime

import pytz
tz = pytz.timezone('Asia/Dubai')


def localize_utc_tz(d):
    return tz.fromutc(d)

default_args = {
    'start_date': datetime(2017, 11, 8),
}
dag = DAG(
    'plus_4_utc',
    default_args=default_args,
    schedule_interval='0 20 * * *',
    user_defined_filters={
        'localtz': localize_utc_tz,
    },
)
task = BashOperator(
        task_id='task_for_testing_file_log_handler',
        dag=dag,
        bash_command='echo UTC {{ ts }}, Local {{ execution_date | localtz }} next {{ next_execution_date | localtz }}',
)
Run Code Online (Sandbox Code Playgroud)

这输出:

UTC 2017-11-08T20:00:00,本地时间2017-11-09 00:00:00 + 04:00下一个2017-11-10 00:00:00 + 04:00

你必须要小心你使用的变量的"类型".例如ds,ts是字符串,而不是日期时间对象,这意味着过滤器不会对它们起作用


Bre*_*the 0

您可以编写一个 python 实用程序,将基于 tz 的时间表重写为 UTC? https://github.com/bloomberg/tzcron/blob/master/tzcron.py

编辑:最近的提交使 Airflow Timezone 意识到: https://github.com/apache/incubator-airflow/commit/f1ab56cc6ad3b9419af94aaa333661c105185883


归档时间:

查看次数:

3132 次

最近记录:

8 年,9 月 前