Publié le :
Macro CREATION_INTERNE

Test de la macro mv_jobflow pour l'orchestration de tâches

Ce code est également disponible en : Deutsch English Español
En attente de validation
Le script commence par définir un programme SAS© temporaire (`testprog`) qui génère des données aléatoires en utilisant des macro-variables (`macrovar1`, `macrovar2`). Ce programme est ensuite utilisé pour créer deux jobs SAS© (`demo1`, `demo2`) via la macro `%mv_createjob`, simulant des tâches indépendantes. Un jeu de données de contrôle (`work.inputjobs`) est ensuite construit. Il contient les métadonnées nécessaires à `mv_jobflow` pour exécuter les jobs, y compris le contexte d'exécution, l'ID de flux et les valeurs spécifiques des macro-variables pour chaque job. La macro `%mv_jobflow` est appelée avec des paramètres pour gérer la concurrence (`maxconcurrency=2`), rediriger les résultats vers `work.results` et enregistrer un log détaillé dans `myjoblog`. L'option `raise_err=1` assure la propagation des erreurs. Le script vérifie ensuite le contenu du log d'exécution et utilise la macro `%mp_assert` pour valider que le code de retour système (`syscc`) est 0, garantissant que l'ensemble du flux de travail s'est terminé sans erreur.
Analyse des données

Type : CREATION_INTERNE


Toutes les données utilisées dans ce script sont générées en interne ou créées dynamiquement. Le programme `testprog` est écrit dans un fichier temporaire. Le jeu de données `work.inputjobs` est créé via un DATA step dans le script. Les sorties (`work.results`, `myjoblog`) sont également des produits de l'exécution interne du script.

1 Bloc de code
DATA STEP Data
Explication :
Ce bloc crée un fichier SAS temporaire nommé `testprog` et y écrit un programme SAS. Ce programme interne est un DATA step simple qui génère des nombres aléatoires et des observations basées sur des macro-variables (`&macrovar1`, `&macrovar2`) et des informations de contexte (`&_program`, `&flow_id`). Le fichier `testprog` servira de source de code pour les jobs SAS définis ultérieurement, permettant une exécution paramétrable et réutilisable.
Copié !
1filename testprog temp;
2DATA _null_;
3 file testprog;
4 put '%put this is job: &_program;'
5 / '%put this was run in flow &flow_id;'
6 / 'data ;'
7 / ' rval=rand("uniform");'
8 / ' rand=rval*&macrovar1;'
9 / ' do x=1 to rand;'
10 / ' y=rand*&macrovar2;'
11 / ' output;'
12 / ' end;'
13 / 'run;'
14 ;
15RUN;
2 Bloc de code
Macro mv_createjob
Explication :
Ces deux appels à la macro `%mv_createjob` enregistrent les programmes SAS dans `testprog` comme deux jobs exécutables distincts, nommés `demo1` et `demo2`, dans le chemin `/Public/temp`. Cette étape est cruciale pour préparer les tâches qui seront ensuite orchestrées par la macro `mv_jobflow`. Ces jobs sont maintenant prêts à être référencés et exécutés au sein d'un flux de travail.
Copié !
1%mv_createjob(path=/Public/temp,name=demo1,code=testprog)
2%mv_createjob(path=/Public/temp,name=demo2,code=testprog)
3 Bloc de code
DATA STEP Data
Explication :
Ce DATA step construit le jeu de données `work.inputjobs`, qui est la source d'entrée pour la macro `%mv_jobflow`. Il définit un contexte d'exécution ('SAS Job Execution compute context') et spécifie les détails pour plusieurs exécutions des jobs `demo1` et `demo2` au sein de deux flux (`flow_id` 1 et 2). Pour chaque job, différentes valeurs de `macrovar1` et `macrovar2` sont définies, paramétrant ainsi les exécutions individuelles des jobs dans le flux.
Copié !
1DATA work.inputjobs;
2 _contextName='SAS Job Execution compute context';
3 DO flow_id=1 to 2;
4 DO i=1 to 4;
5 _program='/Public/temp/demo1';
6 macrovar1=10*i;
7 macrovar2=4*i;
8 OUTPUT;
9 i+1;
10 _program='/Public/temp/demo2';
11 macrovar1=40*i;
12 macrovar2=44*i;
13 OUTPUT;
14 END;
15 END;
16RUN;
4 Bloc de code
Macro mv_jobflow
Explication :
Ce bloc est l'étape d'exécution principale du flux de travail. La macro `%mv_jobflow` est appelée avec `work.inputjobs` comme source des définitions de tâches. Elle est configurée pour exécuter les jobs avec un maximum de 2 jobs concurrents (`maxconcurrency=2`), stocker les résultats dans le jeu de données `work.results`, et générer un fichier de log détaillé nommé `myjoblog`. L'option `raise_err=1` est activée pour que toute erreur de job soit signalée par le code de retour système. Les messages `%put` affichent la valeur de `syscc` avant et après l'exécution du flux.
Copié !
1* Trigger the flow ;
2 
3%put NOTE: &=syscc;
4 
5%mv_jobflow(inds=work.inputjobs
6 ,maxconcurrency=2
7 ,outds=work.results
8 ,outref=myjoblog
9 ,raise_err=1
10 ,mdebug=1
11)
12 
13%put NOTE: &=syscc;
5 Bloc de code
DATA STEP
Explication :
Ce DATA step lit le contenu du fichier `myjoblog`, qui est généré par la macro `%mv_jobflow` et contient les détails de l'exécution du flux de jobs (statut, erreurs, etc.). Il affiche ensuite chaque ligne de ce fichier directement dans le log SAS. Cela permet une inspection post-exécution complète du déroulement et des résultats du flux de travail.
Copié !
1DATA _null_;
2 INFILE myjoblog;
3 INPUT; put _infile_;
4RUN;
6 Bloc de code
Macro mp_assert
Explication :
Ce bloc utilise la macro `%mp_assert` pour effectuer une vérification post-exécution. Il évalue la condition `&syscc eq 0`, ce qui signifie que le code de retour système doit être zéro, indiquant que l'ensemble du flux de jobs s'est exécuté sans erreur. Le paramètre `desc` fournit une description textuelle de l'assertion, utile pour le débogage et le reporting des tests.
Copié !
1%mp_assert(
2 iftrue=(&syscc eq 0),
3 desc=Check that a zero return code is returned IF no called job fails
4)
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.