0
votes

Comment planifier deux DAG pour fonctionner dans deux annulations différentes, mais la seconde fonctionner uniquement après la fin du premier

J'ai deux DAG différents qui doivent courir dans différentes fréquences. Un i.e. DAG1 doit exécuter chaque semaine et le DAG2 doit fonctionner quotidiennement. Maintenant, DAG2 ne doit exécuter que lorsque DAG1 a terminé, sur chaque occurrence lorsque DAG1 est exécuté.

J'ai défini deux dags comme suit dans deux modules Python différents.

dag1.py xxx

dag2.py xxx

actuellement, j'ai défini manuellement un écart de 5 minutes entre deux dags. Cette configuration ne fonctionne pas actuellement et n'a pas non plus la fonction pour créer dag2 en fonction du DAG1 au besoin.

J'avais vérifié les réponses et voici mais n'a pas pu comprendre.

Remarque: le < Code> Schedule_Intervals est indicatif uniquement. L'intention est d'exécuter dag1 tous les lundis à un temps fixe et exécuté dag2 quotidiennement sur une heure fixe et lundi, il ne devrait qu'après dag1 Finitions. Ici, chaque DAG a également plusieurs tâches.


0 commentaires

3 Réponses :


0
votes
  1. La solution la plus simple consisterait à commencer votre 2e Dag avec un externetasksensor qui attend l'achèvement de la dernière tâche de votre 1er Dag
  2. Alternativement, vous pouvez également déclencher votre 2e Dag à la fin du 1er Dag en utilisant triggerdagrunopérateur . Dans ce cas, cependant, vous ne seriez pas en mesure d'affecter un calendrier_interval au 2e Dag (car il sera «de force» déclenché par le 1er DAG)

1 commentaires

Merci à Y2K-Shubham j'ai essayé avec Triggerdagrunopérateur, mais comme il est clair, il ne remplira pas le but d'exécuter DAG2 quotidiennement. Je vais essayer de trouver quelque chose avec externetasksensor cependant.



0
votes

Vous pouvez écrire les deux tâches dans le même Dag et avoir un aval pour définir la dépendance de la tâche xxx

comme pour les différentes dépendances du calendrier de tâches, créez le DAG avec un horaire quotidien. Pour la tâche avec une horaire hebdomadaire, écrivez un shortcircuitopérateur pour activer un déclencheur hebdomadaire: xxx

puis rendez votre tâche hebdomadaire dépend de ce déclencheur hebdomadaire xxx


4 commentaires

Merci @saurav, cela semble plus proche d'une solution. Mais d'une manière ou d'une autre si j'utilise le shortcircuitopérateur et que la tâche est ignorée (parce que la condition n'a pas réussi), les tâches dépendantes sont également ignorées. Ce qui n'est pas ce que j'attends. Étant donné que la tâche1 ne fonctionnera que hebdomadaire et que la tâche2 devra exécuter quotidiennement (par exemple lorsque la tâche1 est ignorée). tout indice à ce sujet?


Vous pouvez utiliser une tâche conditionnelle. Donc, selon ma première idée (pas la meilleure), écrivez deux fois la tâche quotidienne. Une fois qu'il est exécuté lorsque la tâche hebdomadaire échoue et une fois quand elle passe. Stackoverflow.com/ Questions / 43678408 / ...


J'ai eu lieu à la place de la gâchette 'non_failed' inspirée de ici mais cela ne fonctionne pas. Même pour ce cas aucun travail de déclenchement. J'ai aussi essayé "all_done" qui devrait le laisser courir indépendamment du résultat de la tâche précédente mais n'a pas fonctionné.


Merci @saurav de me donner la bonne direction. Bien que le coupe-circuitopérateur ne fonctionnait pas pour moi en raison du même problème que j'ai mentionné ci-dessus en ce qui concerne la tâche se faire sauter, mais en utilisant la même logique, j'ai pensé à la solution avec BridwyThonOperator. Publier la solution ci-dessous. Merci beaucoup pour!



0
votes

Après beaucoup de lutte pour comprendre le flux, je suis finalement proposé la réponse moi-même (je ne sais pas à quel point il est optimal mais travaille pour moi actuellement). Merci à Cette répondez et Documents de ramification . Voici ma solution en utilisant BIDDPYTHONOPERATOR .

DAG1.PY < PRE> XXX

Ici, le branchphonopérateur utilise la fonction Branch_Tasks pour choisir les tâches à exécuter en fonction de la journée de la semaine.
Une autre capture ici est lorsque crawl_params est exécuté lorsque la condition est vraie pour elle, les avals seront également exécutés mais lorsqu'il est ignoré, ce sont des avames également être ignorés. Pour éviter cela, nous devons passer le trigger_rule = 'non_failié' à l'opérateur de la tâche. Ce qui signifie que la tâche doit fonctionner si aucune des tâches en amont n'a échoué (elles ont soit suivi ou ont été ignorées).


0 commentaires