Publicado el :
Administración CREATION_INTERNE

Orquestación y Prueba de Flujos de Trabajos SAS Viya

Este código también está disponible en: Deutsch English Français
En espera de validación
Attention : Este código requiere privilegios de administrador.
El script comienza definiendo un programa SAS© temporal ('testprog') que simula una tarea de negocio, capaz de fallar (`abort`) aleatoriamente en función de variables macro. Se crean dos trabajos, 'demo1' y 'demo2', a partir de este programa temporal utilizando la macro `%mv_createjob`, colocándolos en la carpeta '/Public/temp' (típicamente una CASLIB). Se construye un dataset `work.inputjobs` para proporcionar los parámetros específicos (`_program`, `macrovar1`, `macrovar2`, `flow_id`, `_contextName`) para cada ejecución de los trabajos en el flujo. Luego se llama a la macro `%mv_jobflow` con este dataset de entrada para iniciar el flujo de trabajos en paralelo (concurrencia máxima de 2), especificando un dataset de salida (`work.results`) y un archivo de log de referencia (`myjoblog`). La opción `raise_err=1` se utiliza para propagar los errores a nivel del sistema, permitiendo así una mejor gestión de los fallos de los trabajos. El código de retorno del sistema (`syscc`) se muestra antes y después de la ejecución del flujo para su seguimiento. Finalmente, el contenido del log del flujo (`myjoblog`) se muestra en el log SAS©, y la macro `%mp_assert` se utiliza para verificar que el `syscc` no es nulo, confirmando que el fallo de los trabajos remotos se informa correctamente. El `syscc` se reinicializa al final del script.
Análisis de datos

Type : CREATION_INTERNE


Los datos se generan completamente internamente. Un programa SAS temporal se crea dinámicamente utilizando un DATA STEP `_null_` que escribe en un `filename temp`. Los parámetros de entrada para el flujo de trabajos (`work.inputjobs`) también se crean mediante un DATA STEP explícito. No se lee directamente ningún archivo externo ni dataset SASHELP para los datos principales del script.

1 Bloque de código
DATA STEP Data
Explicación :
Este bloque SAS crea un archivo temporal llamado `testprog` y escribe un programa SAS en él. Este programa está diseñado para simular una tarea de negocio que utiliza variables macro `&_program`, `&flow_id`, `&macrovar1` y `&macrovar2`. Incluye una lógica condicional donde `abort` se dispara si un valor aleatorio (`rand("uniform")`) es mayor que 0.50, simulando así un fallo de trabajo. El programa también genera un dataset anónimo que contiene variables calculadas (`rval`, `rand`, `y`).
¡Copiado!
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 / ' if (rval>0.50) then abort;'
12 / ' end;'
13 / 'run;'
14 ;
15RUN;
2 Bloque de código
MACRO CALL (mv_createjob)
Explicación :
Llama a la macro `%mv_createjob` para crear un trabajo llamado 'demo1'. Este trabajo se guarda en la ruta '/Public/temp' (probablemente una carpeta en una CASLIB) y utiliza el código SAS generado en el archivo temporal `testprog` como fuente. Esta macro prepara el trabajo para una ejecución posterior en un flujo de trabajos en el entorno SAS Viya.
¡Copiado!
1%mv_createjob(path=/Public/temp,name=demo1,code=testprog)
3 Bloque de código
MACRO CALL (mv_createjob)
Explicación :
Vuelve a llamar a la macro `%mv_createjob` para crear un segundo trabajo llamado 'demo2', utilizando también el mismo código fuente (`testprog`) y la misma ruta de guardado que el trabajo 'demo1'. Esto configura dos trabajos independientes que serán gestionados por el mismo flujo de ejecución.
¡Copiado!
1%mv_createjob(path=/Public/temp,name=demo2,code=testprog)
4 Bloque de código
DATA STEP Data
Explicación :
Este DATA STEP crea el conjunto de datos `work.inputjobs`. Este dataset sirve como tablero de control para el flujo de trabajos, especificando los parámetros de ejecución para cada instancia de trabajo. Define el `_contextName` como 'SAS Job Execution compute context', itera sobre dos `flow_id` distintos y, para cada `flow_id`, prepara ejecuciones para 'demo1' y 'demo2' con diferentes valores para `macrovar1` y `macrovar2`. Esto permite probar el comportamiento de los trabajos con diversas entradas y simular varias ejecuciones.
¡Copiado!
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;
5 Bloque de código
MACRO CALL (%put)
¡Copiado!
1%put NOTE: &=syscc;
6 Bloque de código
MACRO CALL (mv_jobflow)
Explicación :
Llama a la macro `%mv_jobflow` para ejecutar los trabajos definidos. Toma `work.inputjobs` como dataset de entrada (`inds`), limita la concurrencia a 2 trabajos en paralelo (`maxconcurrency=2`), guarda los resultados en `work.results` (`outds`) y la información del log en un fileref `myjoblog` (`outref`). La opción `raise_err=1` es crucial porque asegura que los errores que ocurren en los trabajos ejecutados se reflejan en el `SYSCC` del proceso que llama, permitiendo una gestión centralizada de errores. `mdebug=1` activa el modo de depuración para la macro, proporcionando información detallada en el log.
¡Copiado!
1%mv_jobflow(inds=work.inputjobs
2 ,maxconcurrency=2
3 ,outds=work.results
4 ,outref=myjoblog
5 ,raise_err=1
6 ,mdebug=1
7)
7 Bloque de código
MACRO CALL (%put)
¡Copiado!
1%put NOTE: &=syscc;
8 Bloque de código
DATA STEP
Explicación :
Este DATA STEP lee el contenido del archivo referenciado por `myjoblog` (que ha sido rellenado por la macro `%mv_jobflow` y contiene el log consolidado del flujo de trabajos) e imprime cada línea (`_infile_`) en el log SAS. Es un paso esencial de depuración y verificación para examinar los mensajes y estados generados por los trabajos ejecutados en el flujo.
¡Copiado!
1DATA _null_;
2 INFILE myjoblog;
3 INPUT; put _infile_;
4RUN;
9 Bloque de código
MACRO CALL (mp_assert)
¡Copiado!
1%mp_assert(
2 iftrue=(&syscc ne 0),
3 desc=Check that non zero return code is returned IF called job fails
4)
10 Bloque de código
MACRO CALL (%let)
¡Copiado!
1%let syscc=0;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.