【问题标题】:Will airflow pick up dynamically generated schedule interval?气流会拾取动态生成的调度间隔吗?
【发布时间】:2018-07-24 09:40:49
【问题描述】:

我一直在运行气流 1.9.0 并使用动态生成的调度间隔。

简单地说,我从某个配置文件中获取美国/东部时间戳,获取当前系统时区(可以是 EDT 或 EST),然后将其转换为 UTC 时间,然后转换为 cron 表达式。

例如,如果我今天(美国东部时间 2018 年 7 月 23 日)启动 dag,并且我的输入是美国/东部时间上午 6 点,则会生成一个调度间隔为 UTC 上午 10 点或 0 10 * * 1-5 的 dag。

我的问题是: 如果我让 dag 每天运行,它的日程安排是否会在 11 月夏时制结束时自动更新为 0 11 * * 1-5

我特别想避免在安排这些 dag 时使用 tz-aware 日期时间,这就是为什么我想出了这种 hacky 的时间戳转换方式。

【问题讨论】:

    标签: airflow airflow-scheduler


    【解决方案1】:

    您使用什么库或代码在东部时间戳和生成 cron 表达式之间进行转换?我认为回答您的这部分问题取决于该信息。

    无论如何,这种想法对我来说听起来像是一种代码味道。虽然它在技术上可以工作,但假设您的库正确支持该用例并且时区库保持最新,我相信您最好采用标准路线来确定您想要的 crontab 时间表并使用它始终如一。

    不使用本地时区也是一种最佳做法,例如,在您将服务器从东部移动到太平洋或在不同时区运行多台服务器的情况下 - 随处使用 UTC 可以让您在扩展时保持简单。

    由于 UTC 没有夏令时,这将帮助您避免诸如 DST 错误之类的问题,否则如果不使用 UTC,您必须解决这些问题。

    此外,Airflow 官方文档建议不要使用幼稚的日期时间:

    因为 Airflow 使用时区感知的日期时间对象。如果您的代码创建了日期时间对象,他们也需要注意。

    ...

    尽管 Airflow 运行时完全感知时区,但它仍然接受 DAG 定义中 start_dates 和 end_dates 的原始日期时间对象。这主要是为了保持向后兼容性。

    ...

    很遗憾,在 DST 转换期间,某些日期时间不存在或不明确。在这种情况下,钟摆会引发异常。这就是为什么您应该在启用时区支持时始终创建可感知的日期时间对象。

    https://github.com/apache/incubator-airflow/blob/master/docs/timezone.rst

    您能否详细说明您使用天真日期时间与时区感知日期时间的用例?我很乐意为此添加更具体的建议。

    【讨论】:

    • 在我的用例中,我运行的作业与美国股市的交易时间一致。例如,纳斯达克总是在 9:30 开市,而我的工作应该总是在纽约时间上午 9 点运行,而不管夏令时如何。如果我使用 UTC 来安排,我将不得不在 DST 更改时更新每个作业的时间表
    猜你喜欢
    • 2018-12-10
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多