我正在處理的工作流程中的一項要求是等待某個事件在給定時間內發生,如果它沒有發生,則將該任務標記爲失敗,但仍應執行下游任務。氣流觸發規則「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