web-dev-qa-db-fra.com

Quelle est la différence entre la règle de déclenchement du flux d'air "all_done" et "all_success"?

L'une des exigences du flux de travail sur lequel je travaille est d'attendre qu'un événement se produise pendant un temps donné.Si cela ne se produit pas, marquez la tâche comme ayant échoué, mais la tâche en aval doit être exécutée.

Je me demande si "all_done" signifie que toutes les tâches de dépendance sont effectuées, qu'elles aient réussi ou non.

13
samarth

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

all_done signifie que toutes les opérations ont fini de fonctionner. Peut-être qu'ils ont réussi, peut-être pas.

all_success signifie que toutes les opérations se sont terminées sans erreur

Donc, votre supposition est correcte

14
Sheena

[~ # ~] résumé [~ # ~]
Les tâches sont "toutes terminées" si le nombre de tâches SUCCESS, FAILED, UPSTREAM_FAILED, SKIPPED est supérieur ou égal au nombre de toutes les tâches en amont.

Vous ne savez pas pourquoi il serait supérieur à? Peut-être que les sous-balises font quelque chose de bizarre aux comptes.

Les tâches sont "toutes réussies" si le nombre de tâches en amont et le nombre de tâches en amont de succès sont les mêmes.

[~ # ~] détails [~ # ~]
Le code pour l'évaluation des règles de déclenchement est ici https://github.com/Apache/incubator-airflow/blob/master/airflow/ti_deps/deps/trigger_rule_dep.py#L72

  1. ALL_DONE

Le code suivant exécute le qry et renvoie la première ligne (la requête est une agrégation qui ne renverra jamais qu'une ligne de toute façon) dans les variables suivantes:

successes, skipped, failed, upstream_failed, done = qry.first()

la colonne "terminé" de la requête correspond à ceci: func.count(TI.task_id) en d'autres termes un décompte de toutes les tâches correspondant au filtre. Le filtre spécifie qu'il ne compte que les tâches en amont, à partir du dag en cours, de la date d'exécution en cours et ceci:

 TI.state.in_([
                    State.SUCCESS, State.FAILED,
                    State.UPSTREAM_FAILED, State.SKIPPED])

Donc done est un décompte des tâches en amont avec l'un de ces 4 états.

Plus tard, il y a ce code

upstream = len(task.upstream_task_ids)
...
upstream_done = done >= upstream

Et la règle de déclenchement réelle échoue uniquement sur ce

if not upstream_done
  1. ALL_SUCCESS

Le code est assez simple et le concept est intuitif

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

Pensez à utiliser ShortCircuitOperator aux fins que vous avez indiquées.

8
javed