I. Introduction▲
L'utilisation du mode CheckPoint/Restart permet de soumettre un programme batch qui serait tombé en erreur et ce, à partir de la dernière étape DATA ou PROC valide.
Lorsqu'il est soumis de nouveau, le programme saute jusqu'à l'étape qui était en erreur et ne soumet pas les étapes précédentes.
L'objectif est de laisser la possibilité à l'utilisateur de corriger son programme et de pouvoir le soumettre de nouveau en évitant de tout exécuter depuis le début.
II. Modes de fonctionnement▲
Il existe deux modes, le premier permet de tracer les traitements et de marquer les erreurs ; le second permet de reprendre les traitements là où était marquée la première erreur (si celle-ci a été correctement corrigée).
II-A. Le mode Checkpoint▲
Grâce à ce mode, SAS enregistre des points de repère à chaque étape du programme dans le journal et dans un catalogue nommé CHECKPNT.SAS7BCAT qui contient les informations sur les étapes DATA et les PROC uniquement.
Un certain nombre de précautions doivent être prises en compte avec ce mode pour que tout fonctionne correctement.
Tout d'abord, le programme qui s'exécute doit accéder aux tables intermédiaires du traitement (notamment celles avant l'erreur) sinon il sera en incapacité de reprendre là où il en était. Par conséquent, si la WORK était utilisée, elle ne doit pas être supprimée en fin de session ou recréée à la prochaine. Pour cela, il faut utiliser les options NOWORKTERM et NOWORKINIT (si toutes les données sont enregistrées dans des bibliothèques dites permanentes, ces options ne sont pas utiles).
Ensuite, il est préférable de forcer SAS à s'arrêter dès la première erreur. Ceci est possible avec l'option ERRORCHECK STRICT.
Dans le cadre de l'utilisation de ce mode, voici la liste des options importantes :
- SYSIN : permet l'appel d'un programme SAS ;
- STEPCHKPT : active le mode CheckPoint ;
- STEPCHKPTLIB : permet d'indiquer le LIBREF dans lequel SAS doit sauver le catalogue. Il faut spécifier la commande LIBNAME en amont du programme pour que SAS puisse l'affecter ;
- NOWORKTERM : permet de conserver la WORK à la fin de la session ;
- NOWORKINIT : évite d'initialiser une nouvelle WORK au démarrage de la session ;
- ERRORCHECK STRICT : force l'analyse syntaxique des étapes LIBNAME, FILENAME, %INCLUDE et LOCK ;
- ERRORABEND : force l'arrêt sur n'importe quelle erreur.
II-A-1. Illustration de la mise en place du mode checkpoint▲
Nous créons un appel de SAS sous forme de ligne de commande. Le programme exécuté se nomme « production » et nous utilisons les options précitées qui servent à contrôler le niveau d'erreur (avec ERRORCHECK STRICT, ERRORABBEND) et d'activer le mode Checkpoint (avec STEPCHKPT).
Ici STEPCHKPTLIB permet de sauvegarder le catalogue dans le LIBREF savCheck. Par contre la WORK est détruite en fin de session :
Sas -sysin "c:\projet_alpha\production.sas"
-stepchkpt -stepchkptlib savCheck -errorcheck strict -errorabbend
Ici la WORK est conservée (avec NOWORKTERM NOWORKINIT). Nous verrons que ces deux options sont fondamentales à ce mode de travail.
sas -sysin "c:\projet_alpha\production.sas"
-stepchkpt -noworkterm -noworkinit -errorcheck strict -errorabbend
II-B. Le mode Restart▲
Il faut exécuter le programme avec l'option STEPRESTART pour que le programme puisse être relancé à partir de la dernière erreur après que le catalogue CHECKPNT.SAS7BCAT ait été analysé. Dans ce cas, SAS relit le catalogue afin d'isoler les étapes s'étant correctement terminées et reprendre à celle qui était tombée en erreur.
Ce mode exécute tout d'abord les étapes générales telles que les LIBNAME, FILENAME et les compilations de macros car le catalogue contient uniquement les informations sur les étapes en erreur ou en succès. De cette façon, les éléments cruciaux ne sont pas omis.
Afin de contrôler un peu plus le mode Restart, il est possible d'ajouter une option forçant SAS à exécuter une étape importante. Ce peut être une étape DATA ou la définition de macro-variables par exemple. Ceci se fait avec l'option CHECKPOINT EXECUTE_ALWAYS qui se place immédiatement avant l'étape considérée.
Enfin, le lancement du mode Restart peut également s'accompagner du lancement du mode Checkpoint. Comme le programme peut encore tomber en erreur, il sera possible de corriger et de relancer.
Ainsi nous aurons la ligne suivante qui cumule les deux modes :
sas -sysin "c:\projet_alpha\production.sas"
-stepchkpt -stepRestart -stepchkptlib savCheck -errorcheck strict -errorabbend
III. Exemples de mise en œuvre▲
Les exemples suivants vont illustrer l'utilisation du mode Checkpoint/Restart avec l'exécution d'un programme SAS sur une plate-forme Windows SAS 9.3. Ce procédé fonctionnera en 9.2 et sur UNIX.
III-A. Programme avec conservation de la WORK▲
Nous créons un fichier .bat permettant d'appeler le programme datametric.sas grâce à la commande SYSIN. Nous employons les options permettant de conserver la LOG et la WORK en plus du mode CheckPoint.
Le programme contient trois étapes simples : une étape DATA, une proc SORT et une étape DATA qui conclut le programme.
libname
libtest "C:\Data
\test";
%let
choix=
1;
data
premiere;
length rowid 8; *
unique id
;
do
level_
1 =
0 to
2;
do
level_
2 =
0 to
2;
do
x
=
1 to
6+
10*
ranuni(1234);
rowid +
1;
y =
sin(rowid/
2);
output
;
end
;
end
;
end
;
run
;
proc
sort data
=
premiere;
by
level_
1;
run
;
data
second;
set
premiere;
where
level_
1=
&choix;
run
;
Voici le contenu du fichier .bat qui appelle ce programme :
"C:\Program Files\SASHome\SASFoundation\9.3\sas.exe"
-CONFIG "C:\Program Files\SASHome\SASFoundation\9.3\nls\en\sasv9.cfg"
-LOG "C:\Data\test\monfichier.log"
-sysin "C:\Data\test\Datametric.sas"
-stepchkpt -noworkterm -noworkinit -errorcheck strict -errorabend
Le journal du traitement qui suit montre clairement que le mode Checkpoint est activé avec l'insertion des balises CHECKPOINT avant chaque étape.
Pour constater l'arrêt sur une erreur, nous insérons une maladresse typographique dans le programme.
Le code suivant :
proc
sort data
=
premiere;
by
level_
1;
run
;
Devient :
proc
sort data
=
premire;
by
level_
1;
run
;
Lorsque le programme tombe en erreur, la WORK est conservée avec le catalogue permettant à SAS de savoir où repartir ainsi que la première table générée (elle n'avait pas d'erreurs).
Nous relançons le programme corrigé avec l'option -STEPRESTART cette fois. Par précaution, nous laissons le mode Checkpoint afin de pouvoir stopper sur une prochaine erreur.
Contenu du fichier .bat :
"C:\Program Files\SASHome\SASFoundation\9.3\sas.exe"
-CONFIG "C:\Program Files\SASHome\SASFoundation\9.3\nls\en\sasv9.cfg"
-LOG "C:\Data\test\monfichier.log"
-sysin "C:\Data\test\Datametric.sas"
-stepchkpt -stepRestart -noworkterm -noworkinit -errorcheck strict -errorabend
Cette fois, la première étape est reconnue comme étant sans erreur et donc est ignorée.
Dans le journal, les étapes sont encore marquées en mode Checkpoint car l'option STEPCHKPT est utilisée par crainte d'une nouvelle erreur.
III-B. Programme avec utilisation d'une WORK temporaire▲
Cet exemple prouve que même si le catalogue est sauvegardé dans un répertoire permanent alors que les données sont stockées dans une véritable WORK, alors le mode RESTART se trouve dans l'incapacité de rejouer le traitement.
Voici le contenu du nouveau .bat où les options de conservation de la WORK sont supprimées.
"C:\Program Files\SASHome\SASFoundation\9.3\sas.exe"
-CONFIG "C:\Program Files\SASHome\SASFoundation\9.3\nls\en\sasv9.cfg"
-LOG "C:\Data\test\monfichier.log"
-sysin "C:\Data\test\Datametric.sas"
-stepchkpt -STEPCHKPTLIB libtest -errorcheck strict -errorabend
Si l'on indique l'option -STEPCHKPTLIB libtest dans la ligne de commande, le catalogue est conservé dans le répertoire lié au LIBREF libtest défini dans le programme (ici C:\Data\test).
Nous obtenons dans le journal les informations suivantes, puis la même erreur un peu plus bas.
NOTE: Begin CHECKPOINT execution mode
.
NOTE: Checkpoint library: C:\Data
\test.
NOTE: WORK
library: C:\sasfiles\saswork\datametric\_
TD4132_
WIN-
EH2M0MSIPC9_.
Après correction, nous relançons.
Puisque la WORK n'était pas conservée et que les données n'étaient pas enregistrées dans un répertoire permanent, le programme tombe de nouveau en erreur car la première étape créant la table PREMIERE, n'a pas été rejouée : la table source de la seconde étape n'existe pas et retourne une erreur. C'est un cercle vicieux qui s'amorce car le programme sait d'où repartir mais n'a plus les données pour le faire.
Par conséquent, il faut conserver le catalogue et les données dans un répertoire qui n'est pas temporaire.
III-C. Utilisation du mode Checkpoint/Restart avec une boucle macro▲
On teste si le mode de marquage SAS rentre dans une boucle macro.
Ici le programme crée dix tables à partir d'une seule. Nous introduisons une erreur de syntaxe (un point-virgule manquant) qui créera une erreur uniquement sur l'étape n° 5.
%macro
loop;
%do
i=
1 %to 10;
data
test&i;
set
sashelp.
class
;
%if
&i=
5 %then
%do
;
i=
2
%end
;
run
;
%end
;
%mend
;
%loop;
Comme dans le premier exemple, la ligne de commande exécutant ce programme va permettre de conserver
la WORK et le catalogue qui sera dedans.
Le mode Checkpoint reconnaît parfaitement chaque étape DATA et stoppe sur l'erreur.
Après correction, nous lançons la ligne de commande avec l'option STEPRESTART et nous constatons que le programme reprend à la cinquième étape et poursuit son travail.
IV. Conservation des WORK▲
À ce stade il faut connaître le fonctionnement des options NOWORKTERM et NOWORKINIT pour comprendre comment les utiliser.
Ces deux options permettent de conserver la WORK et de ne pas en recréer une afin d'exploiter celle que la précédente session a créée. Dans ce cas, SAS n'agit pas comme à l'accoutumée en créant un répertoire dynamiquement mais utilise directement le répertoire spécifié dans l'option -WORK du fichier CFG (on peut concevoir que la WORK devient un répertoire unique et permanent).
Illustrons cela.
L'environnement suivant crée les WORK dans le répertoire suivant : C:\sasfiles\saswork\!username car le fichier sasv9.cfg contient une définition permettant de créer un répertoire sous le nom de l'utilisateur.
Ce code signifie qu'une WORK est créée dans le sous-répertoire reprenant le nom de l'utilisateur. Ce code permet donc d'obtenir un résultat comme celui-ci pour l'utilisateur nommé sassrv :
Lorsque l'option NOWORKTERM est utilisée, SAS stocke les tables directement dans le répertoire nommé dans le fichier sasv9.cfg sans créer de répertoire commençant par _TD_. Il n'en créera d'ailleurs pas d'autres, tout se déroulera dans ce seul répertoire. Pour le voir, nous lançons des programmes avec nos deux options sous le user Datametric. Nous constatons dans la capture suivante que tout est écrit directement dans C:\sasfiles\saswork\datametric :
En conclusion, si ces options doivent être utilisées, il faut prendre garde à créer un répertoire WORK pour chaque programme lancé en batch afin que tous n'écrivent pas au même endroit. Il suffit pour cela d'ajouter la commande -WORK dans la ligne de commande SAS appelée dans le batch. Il faut également utiliser NOWORKINIT pour que SAS ne vide pas le contenu de la WORK à la prochaine ouverture de session.
V. Conclusion▲
Le mode Checkpoint/Restart permet de relancer des traitements à partir de l'étape tombée en erreur. Les deux modes se cumulant, il est possible de relancer un programme après l'avoir corrigé et de marquer de nouvelles erreurs. Le premier identifie l'étape, le second permet de repartir de l'étape incriminée.
Ce mode de fonctionnement est finalement assez pratique pour éviter de relancer tous les programmes d'un batch et leurs étapes.
Cependant, il faut prendre garde à utiliser le bon ensemble d'options pour que tout ceci fonctionne :
- il faut que toutes les tables soient accessibles afin que le programme puisse accéder aux données nécessaires pour repartir dans de bonnes conditions ;
- il faut conserver le catalogue dans une bibliothèque permanente pour que SAS le retrouve. Les options NOWORKTERM NOWORKINIT doivent donc être utilisées si l'on ne souhaite travailler en WORK plutôt que dans des bibliothèques permanentes ;
- si des étapes importantes doivent être obligatoirement exécutées, l'étape CHECKPOINT EXECUTE_ALWAYS doit être placée avant elles.
Les administrateurs peuvent adopter aisément une stratégie de prise en charge des programmes en production avec ces deux modes. Une même ligne de commande acceptant les options STEPCHKPT et STEPRESTART, il n'est pas utile de créer plusieurs .bat selon que l'on soit en mode Checkpoint ou Restart. Il faut noter enfin que tout n'est pas automatisable car une intervention humaine reste nécessaire pour corriger le programme.
VI. À propos de l'auteur▲
Stéphane dirige DATAMETRIC, société qu'il a fondée en 2002 pour proposer un ensemble de services autour de l'analytique et dans le choix et la mise en œuvre d'environnements BI SAS et COGNOS. En accompagnant ses propres clients ou en travaillant en partenariat avec d'autres sociétés de services, Stéphane mêle désormais des actions d'audit et conseil en architecture, d'installation de plates-formes, de développement et de formations personnalisées auprès de sociétés européennes de toutes tailles et d'organisations internationales.
VII. Remerciements▲
J'adresse tous mes remerciements à f-leb et Claude LELOUP pour le temps qu'ils m'ont accordé pour la correction de cet article.