В чем разница между правилом триггера воздушного потока "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
- 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
- ALL_SUCCESS
Код довольно прост, а концепция интуитивно понятна.
num_failures = upstream - successes
if num_failures > 0:
... it fails
Ответ 3
Попробуйте использовать ShortCircuitOperator для указанной вами цели.