airflow - 如何触发每日 DAG 在本地时间午夜而不是 UTC 时间午夜运行

标签 airflow airflow-scheduler

我位于 UTC+4 时区,因此当 Airflow 触发夜间 ETL 时,这里已经是凌晨 4:00。如何告诉 Airflow 在 ds-1 天 20:00 触发 ds 天的运行,但 ds=ds?

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

编辑:一个 hacky 解决方案是将其定义为每天晚上 20:00 运行,即“前一天”,但然后在工作。但这在 Airflow UI 上看起来仍然很奇怪,因为这将显示 UTC 执行时间。

最佳答案

计划间隔也可以是“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 }}',
)

输出:

UTC 2017-11-08T20:00:00, Local 2017-11-09 00:00:00+04:00 next 2017-11-10 00:00:00+04:00

您必须小心您使用的变量的“类型”。例如,dsts 是字符串,而不是日期时间对象,这意味着过滤器无法处理它们

关于airflow - 如何触发每日 DAG 在本地时间午夜而不是 UTC 时间午夜运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47112291/

相关文章:

python - 如何在 sla_miss_callback 函数中获取上下文对象

Airflow DAG 并行任务延迟/执行延迟 60 秒

python-3.x - Xcom pull 返回 `ti` 上的 NameError

python - 实现等到 Airflow 中满足特定条件的有效方法

python - 即使由于 dagbag 错误而从 UI 手动触发了 dags,Airflow 也不会触发 dags

hive - Airflow HiveCliHook 连接到远程配置单元集群?

timeout - Airflow 列表 dag 在 30 秒后恰好超时

airflow - Airflow 中的执行日期 : need to access as a variable

airflow - 如何将自定义组件添加到 Elyra 的可用 Airflow 操作符列表中?

docker - 通过 Docker 登录 Airflow 的默认用户 ID 和密码是什么?