Airflow 如何从宏中获取气流时区信息?

Airflow 如何从宏中获取气流时区信息?,airflow,Airflow,背景 我试着从周一到周五,每天晚上10点在美国/纽约运行一次DAG。DAG运行的脚本在其运行的当天作为输入 时区(周一至周五晚上10点)。当我把这个纸条作为一个DAG运行时,日期是从宏{{ds_nodash}} 问题 当气流运行时,纽约时间晚上10点,UTC时间已经是第二天了。由于Airflow使用UTC,执行日期提前一天,因此当我的DAG使用宏{{ds_nodash}}时,它提前一天 问题: 是否有办法将时区调整日期作为气流上的宏获取,或者是我自己调整宏的问题的唯一解决方案?现在气流中提供了时

背景

我试着从周一到周五,每天晚上10点在美国/纽约运行一次DAG。DAG运行的脚本在其运行的当天作为输入 时区(周一至周五晚上10点)。当我把这个纸条作为一个DAG运行时,日期是从宏
{{ds_nodash}}

问题

当气流运行时,纽约时间晚上10点,UTC时间已经是第二天了。由于Airflow使用UTC,执行日期提前一天,因此当我的DAG使用宏
{{ds_nodash}}
时,它提前一天

问题:


是否有办法将时区调整日期作为气流上的宏获取,或者是我自己调整宏的问题的唯一解决方案?

现在气流中提供了时区功能。查看并相应地调整
afflow.cfg
中的配置

默认情况下是这样的

[core]
default_timezone = utc
调整到

[core]
default_timezone = America/New_York

然后,执行日期将包含您可以提取的TZ信息。在您进入生产环境之前,请在测试环境中试用。

我想您可能会弄乱气流中的两个不同概念

  • 实际上,“ds”不是任务运行的日期,它是任务运行的前一段时间。例如,对于ds为2019年3月25日,它将在2019年3月26日而不是3月25日运行。因此,如果希望任务在周一至周五完全运行,则需要将计划间隔设置为“0 22**1-5”。工作日设置应为“1-5”而不是“2-6”

  • 对于时区,kaxil的回答解释得很好。但是,如果出于某种原因,您无法更改airflow服务器配置,则需要做的是将schedule_interval调整为“0 2**2-6”。然后,任务将按预期运行

  • 根据,默认变量(如
    {{ds_nodash}}
    )以UTC为单位。所以,我们需要自己改变他们。它可以是这样的:

    # ...
    local_ds_nodash = '{{ dag.timezone.convert(execution_date).strftime("%Y%m%d") }}'
    # ...
    create_file = BashOperator(
        task_id='create_file',
        bash_command=f'touch {local_ds_nodash}.txt'
    )
    

    我已经试过了,但它对我不起作用。对我来说,有效的方法是为每个dag定义一个时区。不管怎样,我的问题是如何提取特定时区的执行日期。由于气流文档没有建议更改时区,我将其保留为
    utc
    ,但在
    args
    中添加了
    tzinfo=be摆.timezone('America/New_York')
    per
    DAG
    。然后,当我将时间表间隔定义为“0 22**1-5”时,它将在周一至周五纽约时间22:00运行,正确与否?如果这样设置:
    start\u date=datetime(2019,3,23,tzinfo=be摆时区(“美国/纽约”)
    0 22**1-5
    。但我没有机会测试它。因此,我不建议您这样做,因为工作日设置可能会在这些计算中导致一些意外的结果。为什么不直接使用“02**2-6”?