0

我有一个运行的 Apache Airflow 托管环境,其中定义并启用了许多 DAG。一些 DAG 是按计划运行的,按 15 分钟的计划运行,而另一些则没有计划。所有的 DAG 都是单任务 DAG。DAG 的结构如下:

2 级 DAG ->(触发器)1 级 DAG ->(触发器)0 级 DAG

调度的 DAG 是 2 级 DAG,而 1 级和 0 级 DAG 是非调度的。0级DAG用于ECSOperator调用预定义的弹性容器服务(ECS)任务,调用ECS任务中定义的Docker容器内的Python ETL脚本。2 级 DAG 等待 1 级 DAG 完成,然后依次等待 0 级 DAG 完成。ETL 脚本生成的完整 Python 日志在 ECS 任务运行的 CloudWatch 日志中可见,而 Airflow 任务日志仅显示高级日志记录。

计划 DAG(级别 2)中的单个任务已depends_on_past设置False为计划运行从发生。但是正在发生的事情是 Airflow 覆盖了这一点,我可以在 UI 中清楚地看到,特定级别 2 DAG 运行的失败正在阻止调度程序选择下一次运行 - 下一次调度运行状态被设置为None,我必须手动清除失败的 DAG 运行状态,然后调度程序才能再次调度它。

为什么会这样?据我所知,没有 Airflow 配置选项应该覆盖2 级 DAG 任务中False的任务级别设置。depends_on_past任何指针将不胜感激。

4

1 回答 1

1

回答“为什么会这样?”的问题。我了解您正在观看的行为是由 Tasks 定义为wait_for_downstream = True. 文档说明了以下内容:

wait_for_downstream (bool) -- 当设置为 true 时,任务 X 的实例将等待任务 X 的前一个实例下游的任务成功完成或在运行之前被跳过。如果任务 X 的不同实例更改了相同的资产,并且此资产由任务 X 下游的任务使用,这将很有用。请注意,无论使用 wait_for_downstream,depends_on_past 都被强制为 True。另请注意,仅等待前一个任务实例下游的任务;任何下游任务的状态都将被忽略。

请记住,任务 X 的先前实例 一词是指上次计划的 dag_run 的 task_instance,而不是上游任务(在具有每日计划的 DAG 中,这将是“昨天”的 task_instance)。

这也解释了为什么一旦您清除了先前 DAG 运行的状态,您的任务就会被执行。

我希望它可以帮助你澄清事情!

于 2021-10-13T13:48:26.857 回答