我正在处理的工作流程中的一个要求是等待某个事件在给定时间内发生,如果没有发生则将任务标记为失败仍然应该执行下游任务。
我想知道“all_done”是否意味着所有依赖任务都已完成,无论它们是否成功。
答案 0 :(得分:13)
https://airflow.incubator.apache.org/concepts.html#trigger-rules
all_done表示所有操作都已完成。也许他们成功了,也许不是。
all_success表示所有操作都已完成且没有错误
所以你的猜测是正确的
答案 1 :(得分:9)
<强>概要强>
任务是&#34;所有完成&#34;如果SUCCESS,FAILED,UPSTREAM_FAILED,SKIPPED任务的计数大于或等于所有上游任务的计数。
不确定为什么它会大于?子公司也许做了一些奇怪的事情。
任务是&#34;所有成功&#34;如果上游任务的计数和上游任务的成功计数是相同的。
<强>详情
评估触发器规则的代码在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()
&#34;完成&#34;查询中的列对应于此: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
答案 2 :(得分:8)
考虑将ShortCircuitOperator用于您所说的目的。
答案 3 :(得分:0)
所有运算符都有一个trigger_rule参数,该参数定义触发生成的任务的规则。
我在以下用例中使用了这些触发规则:
所有成功 :(默认)所有父母都成功
all_done :所有父母均已执行死刑。
To carry out cleanups irrespective of the upstream tasks
succeeded or failed then setting this trigger_rule to ALL_DONE is always useful.
one_success :一旦至少一位父母成功,就会触发,它不会等待所有父母都完成
To trigger external DAG after successful completion of the single upstream parent.
one_failed :一旦至少一位父母失败,就会触发,它不会等待所有父母都完成
To trigger the alerts once at least one parent fails or for any other use case.