如何正确处理Apache Airflow中的夏令时?

jhn*_*lvr 5 dst airflow

在气流中,一切都应该是UTC(不受DST影响).

但是,我们的工作流程基于受DST影响的时区提供服务.

示例场景:

  • 我们的工作安排在东部时间上午8:00开始,时间间隔为24小时.
  • 每天早上8点东部,调度员看到自上次运行以来已经24小时,并且运行该作业.
  • DST发生了,我们失去了一个小时.
  • 今天上午8点东部,调度员看到它只有23个小时,因为机器上的时间是UTC,并且直到东部时间上午9点才开始工作,这是一个延迟交付

有没有办法安排dags,以便他们在时间变化后的正确时间运行?

apa*_*man 5

脱离我的头顶:

如果您的机器具有时区感知功能,请将DAG设置为在美国东部标准时间上午8点美国东部夏令时上午8点运行.有点像0 11,12 * * *.让第一个任务成为ShortCircuit操作员.然后使用像pytz这样的东西来定位当前时间.如果它在您所需的时间内,请继续(IE:运行DAG).否则,返回False.您每天只需要额外的2个额外任务,但只要您的机器没有超载,延迟就应该是最小的.

草率的例子:

from datetime import datetime
from pytz import utc, timezone

# ...

def is8AM(**kwargs):
    ti = kwargs["ti"]
    curtime = utc.localize(datetime.utcnow())
    # If you want to use the exec date:
    # curtime = utc.localize(ti.execution_date)
    eastern = timezone('US/Eastern') # From docs, check your local names
    loc_dt = curtime.astimezone(eastern)
    if loc_dt.hour == 8:
        return True
    return False

start_task = ShortCircuitOperator(
                task_id='check_for_8AM',
                python_callable=is8AM,
                provide_context=True,
                dag=dag
            )
Run Code Online (Sandbox Code Playgroud)

希望这是有帮助的

编辑:运行时错误,减去而不是添加.此外,由于如何启动运行,如果您希望它们以8 运行,您可能最终希望按小时计划安排7AM .


jhn*_*lvr 4

这个问题是在 Airflow 版本 1.8.x 时提出的。

从 Airflow 1.10 开始,此功能现已内置。

https://airflow.apache.org/timezone.html

设置时区airflow.cfg和夏令时应该正确处理。

  • 但请注意,“schedule_interval”仍然不会考虑 DST。正如文档中所写:``如果您设置了 cron 计划,Airflow 会假设您始终希望在完全相同的时间运行。然后它将忽略夏令时。因此,如果您的时间表规定每天在 08:00 GMT+1 的间隔结束时运行,则无论是否采用夏令时,它都将始终在 08:00 GMT+1 的间隔结束时运行。```解决方法是使用时区感知的“datetime”对象,请参阅此处:/sf/ask/3686788731/ (4认同)