气流调度器模式

Airflow Scheduler Pattern

运行 一个 DAG 在一个月内有 3 次调度模式是否可行 - 每月第 5 天、月底前 14 天和月底。

谢谢

我认为这里最好的解决办法是每天 运行 你的 DAG,然后检查 execution_date 是否符合你的条件。

crontab 表达式只支持前进一天。对于一个月的第5天,应该是'0 0 5 * *',但是向后是不可能的。

另一种选择是在 Cron 表达式中指定日期。 参考这个,我们可以用L表示月底。但是,它无法确定月底前的 14 天。我不确定用 14th 来表示最后两周是否可以接受。

提议的 schedule_interval 将是 "0 0 5,14,L * *"。但由于 Airflow 将在每个周期结束时 运行,因此 执行日期将显示上个月的日期 。并且您需要确保 start_date 超过一个月才能开始触发。

解决第 14 天的问题Python,

import calendar

last_day = calendar.monthrange("{{ execution_date.year }}", "{{ execution_date.month }}")[1]

schedule_interval = f"0 0 5,{last_day - 14},L * *"

或使用 Pendulum 方法和 execution_date 代替:

last_day = "{{ execution_date.days_in_month }}"
schedule_interval = f"0 0 5,{last_day - 14},{last_day} * *"

对于 Airflow 2.1 或更新版本,不要忘记在 DAG 中添加 render_template_as_native_obj=True,使其输出为 Python 对象而不是字符串。如果不行,需要转成int。

参考文献cron format in Crontab.guru(那里不支持L字符,所以我用31作为占位符)