airflow - 支持手动和定时执行

标签 airflow airflow-scheduler

我的组织已经使用仅在手动触发器上运行的 DAG 相当一段时间了。 dag 与之交互的任何外部资源都通过执行日期 {{ ds_nodash }} 进行参数化。

我们最近将此 dag 转换为按每周计划运行,我发现 Airflow “调度程序在其计划周期结束时触发 DAG 运行,而不是在其开始时”。我根本没想到会这样。我并不是想争论 Airflow 的调度程序设计,而是寻找一些关于如何编写通过手动触发和预定间隔工作的 DAG 的建议。

这是我的具体困境:

  1. 为了解决调度程序使用周期开始的事实,我可以使用 {{ next_ds_nodash }},但手动触发的 dag 永远不会通过其自己的执行日期进行参数化
  2. 当手动触发时,我们想要查看 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_dagmy_awesome_dag_manual

通过此设置,您可以尝试并确保它始终查看与该 execution_date 相关的文件。然后,您可以在 GUI 中将它们都保持为“ON”(打开),虽然每周的一个确实每周都会触发,但另一个只有在您按下播放按钮时才会触发。

关于airflow - 支持手动和定时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61064837/

相关文章:

docker - 在另一个 Docker 容器中运行 AirFlow 任务

python - AWS Managed Airflow - 如何重启调度程序?

python - 如何隐藏/屏蔽 Airflow 连接和可变截面的敏感数据?

airflow - 读取 XCOM 和 Airflow 变量可能会减慢 Airflow(在 Google Cloud Composer 中)

timeout - Airflow 列表 dag 在 30 秒后恰好超时

cron - 手动触发 Airflow DAG 会干扰预定的 Airflow 触发吗?

Airflow :日志文件不是本地的,不受支持的远程日志位置

python - Airflow - 在 DockerOperator 中使用 run_id 作为卷名称

python - 如何在 Airflow 中的 SLA 上设置时间对象而不是 timedelta?

django - Airflow 的网络服务器未运行