我的组织已经使用仅在手动触发器上运行的 DAG 相当一段时间了。 dag 与之交互的任何外部资源都通过执行日期 {{ ds_nodash }} 进行参数化。
我们最近将此 dag 转换为按每周计划运行,我发现 Airflow “调度程序在其计划周期结束时触发 DAG 运行,而不是在其开始时”。我根本没想到会这样。我并不是想争论 Airflow 的调度程序设计,而是寻找一些关于如何编写通过手动触发和预定间隔工作的 DAG 的建议。
这是我的具体困境:
- 为了解决调度程序使用周期开始的事实,我可以使用 {{ next_ds_nodash }},但手动触发的 dag 永远不会通过其自己的执行日期进行参数化
- 当手动触发时,我们想要查看 7 天前的另一个文件:{{execution_date - Macros.timedelta(days=7)).strftime("%Y%m%d") }}。当计划触发时,现在看起来已经过去 14 天了。我怎样才能同时实现这两个目标?
我并不是在寻找直接解决我的困境的方法,而是想知道我按计划手动运行 DAG 的意图是否真的很不寻常?如果不是,我的困境的具体解决方案是什么,或者编写您可以手动触发和安排的 DAG 的一些最佳实践。
最佳答案
每当我需要按计划运行 DAG 时并且偶尔以手动方式运行时,我总是...创建两个 DAG!
我认为这实际上是 Airflow 本身的官方推荐。只需创建两个 DAG,并设置一个为每周计划,如 schedule_interval = '0 5 * * 1' # Every Monday at 5:00
和一个 schedule_interval = None
。为他们提供 ID,例如 my_awesome_dag
和 my_awesome_dag_manual
。
通过此设置,您可以尝试并确保它始终查看与该 execution_date
相关的文件。然后,您可以在 GUI 中将它们都保持为“ON”(打开),虽然每周的一个确实每周都会触发,但另一个只有在您按下播放按钮时才会触发。
关于airflow - 支持手动和定时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61064837/