В чем разница между правилом триггера воздушного потока "all_done" и "all_success"?

Одним из требований в рабочем процессе, над которым я работаю, является ожидание того, что какое-то событие произойдет в течение заданного времени, если это не произойдет, пометьте задачу как потерпевшую неудачу, тем не менее должна выполняться задача вниз по течению.

Мне интересно, означает ли "all_done" все задачи зависимостей, независимо от того, были ли они успешными или нет.

Ответ 1

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

all_done означает, что все операции завершены. Возможно, им это удалось, а может и нет.

all_success означает, что все операции завершены без ошибок

Так что ваше предположение верно

Ответ 2

РЕЗЮМЕ
Задачи "все выполнены", если число задач SUCCESS, FAILED, UPSTREAM_FAILED, SKIPPED больше или равно количеству всех вышестоящих задач.

Не уверен, почему это будет больше, чем? Возможно, subdags делают что-то странное с подсчетами.

Задачи являются "успешными", если количество исходных задач и количество успешных исходных задач совпадают.

ДЕТАЛИ
Код для оценки правил триггера находится здесь https://github.com/apache/incubator-airflow/blob/master/airflow/ti_deps/deps/trigger_rule_dep.py#L72

  1. ALL_DONE

Следующий код запускает 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
  1. ALL_SUCCESS

Код довольно прост, а концепция интуитивно понятна.

num_failures = upstream - successes
if num_failures > 0:
... it fails

Ответ 3

Попробуйте использовать ShortCircuitOperator для указанной вами цели.