我正在处理的工作流程中的一项要求是等待某个事件在给定时间内发生,如果它没有发生,则将该任务标记为失败,但仍应执行下游任务。气流触发规则“all_done”和“all_success”之间有什么区别?
我在想,如果“all_done”意味着所有的依赖任务都完成了,不管他们是否成功了。
我正在处理的工作流程中的一项要求是等待某个事件在给定时间内发生,如果它没有发生,则将该任务标记为失败,但仍应执行下游任务。气流触发规则“all_done”和“all_success”之间有什么区别?
我在想,如果“all_done”意味着所有的依赖任务都完成了,不管他们是否成功了。
https://airflow.incubator.apache.org/concepts.html#trigger-rules
all_done意味着所有的操作已经完成的工作。也许他们成功了,也许不成功。
all_success意味着所有的操作都没有错误
完成所以,你的猜测是正确的
考虑使用ShortCircuitOperator你所述的目的。
内容
中的任务“全部完成”如果SUCCESS的计数,FAILED,UPSTREAM_FAILED,SKIPPED任务是大于或等于的所有上游任务计数。
不知道为什么它会大于?也许子标签对这些数字做了一些奇怪的事情。
如果上游任务的计数和成功上游任务的计数相同,那么任务“全部成功”。
详情
为evaulating触发规则的代码是在这里https://github.com/apache/incubator-airflow/blob/master/airflow/ti_deps/deps/trigger_rule_dep.py#L72
下面的代码运行qry
并返回第一行(查询是一个聚合那将只会返回一行)到以下变量:
successes, skipped, failed, upstream_failed, done = qry.first()
查询中的“完成”列对应于:func.count(TI.task_id)
换句话说,所有与过滤器匹配的任务的计数。 过滤器指定,它是只计算上游任务,从目前的DAG,从目前的执行日期和此:
TI.state.in_([
State.SUCCESS, State.FAILED,
State.UPSTREAM_FAILED, State.SKIPPED])
所以done
是上游任务与4个状态中的一个的计数。
后来有此代码
upstream = len(task.upstream_task_ids)
...
upstream_done = done >= upstream
和实际触发规则仅失败有关此
if not upstream_done
代码非常直接,概念很直观
num_failures = upstream - successes
if num_failures > 0:
... it fails
确实跳过了计数? – pgoggijr
@pgoggijr是的,成功,失败,UPSTREAM_FAILED,SKIPPED都算。 – Davos