在气流中,一切都应该是 UTC(不受 DST 影响)。
但是,我们的工作流程可以根据受 DST 影响的时区交付内容。
一个示例场景:
- 我们安排了一项作业,开始日期为东部时间上午 8:00,计划间隔为 24 小时。
- 每天东部时间上午 8 点,调度程序会看到距离上次运行已经过去 24 小时,并运行作业。
- 夏令时到来,我们损失了一个小时。
- 今天东部时间上午 8 点,调度程序发现时间只有 23 小时,因为机器上的时间是 UTC,并且直到东部时间上午 9 点才运行作业,这是一个延迟交付
有没有办法安排 dags,以便它们在时间更改后在正确的时间运行?
我的头顶上浮现出:
如果您的计算机支持时区,请将 DAG 设置为在美国东部时间上午 8 点运行and世界标准时间 (UTC) 东部夏令时间上午 8 点。就像是0 11,12 * * *
。第一个任务是短路操作员。然后使用 pytz 之类的工具来本地化当前时间。如果在您要求的时间内,请继续(即:运行 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
)
希望这有帮助
编辑:运行时间是错误的,是减去而不是添加。此外,由于跑步的启动方式,如果您希望跑步的话,您最终可能会希望按小时安排在早上 7 点进行run at 8.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)