作者:互粉-结局_596 | 来源:互联网 | 2023-02-05 14:05
在气流中,一切都应该是UTC(不受DST影响).
但是,我们的工作流程基于受DST影响的时区提供服务.
示例场景:
我们的工作安排在东部时间上午8:00开始,时间间隔为24小时.
每天早上8点东部,调度员看到自上次运行以来已经24小时,并且运行该作业.
DST发生了,我们失去了一个小时.
今天上午8点东部,调度员看到它只有23个小时,因为机器上的时间是UTC,并且直到东部时间上午9点才开始工作,这是一个延迟交付
有没有办法安排dags,以便他们在时间变化后的正确时间运行?
1> apathyman..:
脱离我的头顶:
如果您的机器具有时区感知功能,请将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
)
希望这是有帮助的
编辑:运行时错误,减去而不是添加.此外,由于如何启动运行,如果您希望它们以8 运行,您可能最终希望按小时计划安排7AM .