气流触发规则"all_done"和"all_success"之间有什么区别?

sam*_*rth 12 airflow

我正在处理的工作流程中的一个要求是等待某个事件在给定时间内发生,如果没有发生则将任务标记为失败仍然应该执行下游任务.

我想知道"all_done"是否意味着所有依赖任务都已完成,无论它们是否成功.

She*_*ena 16

https://airflow.incubator.apache.org/concepts.html#trigger-rules

all_done表示所有操作都已完成.也许他们成功了,也许不是.

all_success表示所有操作都已完成且没有错误

所以你的猜测是正确的

  • @pgoggijr 是的,成功、失败、上传失败、跳过都算在内。 (2认同)

Dav*_*vos 10

小结
如果SUCCESS,FAILED,UPSTREAM_FAILED,SKIPPED任务的计数大于或等于所有上游任务的计数,则任务"全部完成".

不知道为什么会比这更大?子公司也许做了一些奇怪的事情.

如果上游任务的计数和上游任务的成功计数相同,则任务"全部成功".

详细信息
评估触发器规则的代码在https://github.com/apache/incubator-airflow/blob/master/airflow/ti_deps/deps/trigger_rule_dep.py#L72

  1. 全部完成

以下代码运行qry并返回第一行(查询是一个只会返回一行的聚合)到以下变量中:

successes, skipped, failed, upstream_failed, done = qry.first()
Run Code Online (Sandbox Code Playgroud)

查询中的"完成"列对应于此:func.count(TI.task_id)换句话说,匹配过滤器的所有任务的计数.过滤器指定它仅计算当前dag中的上游任务,从当前执行日期开始计算:

 TI.state.in_([
                    State.SUCCESS, State.FAILED,
                    State.UPSTREAM_FAILED, State.SKIPPED])
Run Code Online (Sandbox Code Playgroud)

因此done是对这4个状态之一的上游任务的计数.

后来有这个代码

upstream = len(task.upstream_task_ids)
...
upstream_done = done >= upstream
Run Code Online (Sandbox Code Playgroud)

实际的触发规则只会失败

if not upstream_done
Run Code Online (Sandbox Code Playgroud)
  1. ALL_SUCCESS

代码相当简单,概念很直观

num_failures = upstream - successes
if num_failures > 0:
... it fails
Run Code Online (Sandbox Code Playgroud)


jav*_*ved 8

考虑将ShortCircuitOperator 用于您所述的目的.