Jobafvikling i batch under Windows Lars L. Andersson Chefkonsulent SAS Institute A/S Pharma & Communications
Hvad vil jeg fortælle om? Og hvorfor? Jobafvikling i batch under Windows Relevante aspekter af SAS (statements, options m.v.) Relevante Windows-aspekter (Command Line kommandoer, scheduler m.v.) Smarte ting, som man kan bruge SAS interface til operativsystemet til Det er ikke nyt men svært at læse sig til i hjælpen og svært at finde et kursus om
Hvem tror jeg egentlig, I er? SAS -programmører uden viden om og erfaring med batch-kørsel af SAS-programmer SAS -programmører med (varierende grad af) erfaring med batch-kørsel af SAS-programmer Nuværende eller kommende administratorer af SAS - baserede systemer, som gerne vil vide noget om SAS i batch-sammenhæng Andre er naturligvis også velkomne!
Hvad vil det sige at køre et SAS -program som et batch-job? SAS Systemet starter som en ny, ikke-interaktiv session Evt. uden menneskelig indgriben (f.eks. blot fordi klokken nu er 3 om natten) Og afvikler SAS-programmet Hvorpå SAS Systemet lukkes ned igen
Hvorfor kan det være interessant at køre SAS - programmer i batch? Langvarige/ tunge transformationer m.v. kan foretages uden for normal arbejdstid og være klar til, at vi møder på arbejde Opdaterede data lagt til rette for dagens ad hoc-analyser Opdaterede data lagt til rette for rapporter og opslag (f.eks. SAS Web Report Studio, SAS Stored Processes, OLAP-kuber m.v.) Opdaterede statiske rapporter (.html,.pdf m.v.) er dannet og klar til brug Job kan indgå i samlede job flows, således at vores program ikke afvikles før, f.eks. en opdateret udgave af input-data er på plads
Hvordan gør man? (Endelig en agenda punkt for punkt!) Start af ikke-interaktiv SAS samt scheduleret kørsel.bat-filer Windows Scheduler Lad os kigge loggen igennem for fejl m.v.! Environment variables Fornuftig organisering af filer Burde vi ikke have logfiler for de sidste N kørsler? Afvikling af flere forskellige job Udstedelse af OS-direktiver fra SAS Afsluttende bemærkninger
Start af ikke-interaktiv SAS samt scheduleret kørsel Trin for trin Trin 1: Start SAS fra command line
Start af ikke-interaktiv SAS samt scheduleret kørsel Trin for trin Trin 1: Start SAS fra command line Trin 2: Start ikke-interaktiv SAS fra command line og få den til at afvikle et SAS-program
Hov! -sysin og -log hvor kender du dem fra? Udvalgte opstartsmuligheder: sysin log altlog autoexec config print sysparm
Start af ikke-interaktiv SAS samt scheduleret kørsel Trin for trin Trin 1: Start SAS fra command line Trin 2: Start ikke-interaktiv SAS fra command line og få den til at afvikle et SAS-program Trin 3: Pak opstartsdirektiver ind i en.bat- eller.cmd-fil og få denne scheduleret
Hvordan gør man? (Endelig en agenda punkt for punkt!) Start af ikke-interaktiv SAS samt scheduleret kørsel.bat-filer Windows Scheduler Lad os kigge loggen igennem for fejl m.v.! Environment variables Fornuftig organisering af filer Burde vi ikke have logfiler for de sidste N kørsler? Afvikling af flere forskellige job Udstedelse af OS-direktiver fra SAS Afsluttende bemærkninger
Lad os kigge loggen igennem for fejl (automatisk) Hvorfor? Der har ikke siddet nogen foran skærmen, som har anmodet om den enkelte jobkørsel dvs. der er ingen for hvem det er naturligt at inspicere loggen umiddelbart efter kørsel I en typisk opsætning er der mange job. De fleste af dem kører forhåbentlig OK, så det er uoverskueligt af skulle åbne N logfiler, hvoraf der i de fleste intet er at komme efter Fejl vil opstå om ikke af andre grunde, så pga. udefrakommende påvirkninger
Lad os kigge loggen igennem for fejl (automatisk) Hvorfor? Vi kan sagtens skrive et SAS -program, som kigger en bestemt tekst-fil (f.eks. en SAS.log fil) igennem og leder efter forekomster af ERROR:, WARNING: o.a. Dette program bør eksekveres i en separat SAS-session Dermed undgås det, at fejl i det primære program forhindrer korrekt søgning efter fejl Dette vil (i nogle tilfælde) endda kunne fange uafsluttede logfiler Scanning af et hvilket som helst (SAS-)job logfil Flere mulige kanaler: E-mail Tabel (som input til dynamisk rapport) Statisk rapport
Lad os kigge loggen igennem for fejl (automatisk) Struktur og navnekonventioner
Lad os kigge loggen igennem for fejl (automatisk) En.bat-fil hejverden.bat :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\hejVerden.sas" -log "..\Logs\hejVerden.log" -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS-program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- "%sasexe%" -sysin "..\Utility\_scanlog.sas" -log "..\Utility\_scanlog.log" -noautoexec -sysparm "hejverden 0" -emailsys SMTP -emailhost smtpsrv03.yourcompany.com -emailport 25 Bemærk: Linjeskift kun vist af hensyn til læselighed!
Lad os kigge loggen igennem for fejl (automatisk) En.bat-fil hejverden.bat :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\hejVerden.sas" -log "..\Logs\hejVerden.log" -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS-program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- "%sasexe%" -sysin "..\Utility\_scanlog.sas" -log "..\Utility\_scanlog.log" -noautoexec -sysparm "hejverden 0" -emailsys SMTP -emailhost smtpsrv03.yourcompany.com -emailport 25 Environment variables
Environment variables Hvad er det? Symbolske referencer til tekst, lidt a la SAS-makrovariable, men oprettet i operativsystemet (her i Windows) Refereres til i en Windows/DOS-kommandoprompt med forog efterstillet procenttegn, f.eks. %lars% Kan anvendes til at generalisere.bat-filer m.v., således at mange hard-coded gentagelser undgås Praktisk til maskin- og miljøspecifikke ting (ofte stier, servernavne og lignende), som sjældent ændres Kan lettest tilgås inde fra SAS ved hjælp af funktionen SYSGET
Environment variables Hvordan læser vi dem fra SAS? Det er oftest mest praktisk at oprette makrovariable i AUTOEXEC.SAS og tildele disse værdier på basis af SYSGET
Hvad med ting, der skal gentages i.bat-filen men som er forskellige fra.bat-fil til.bat-fil!? :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\hejVerden.sas" -log "..\Logs\hejVerden.log" -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS-program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- "%sasexe%" -sysin "..\Utility\_scanlog.sas" -log "..\Utility\_scanlog.log" -noautoexec -sysparm "hejverden 0" -emailsys SMTP -emailhost smtpsrv03.yourcompany.com -emailport 25 Bemærk: Linjeskift kun vist af hensyn til læselighed!
Hvad med ting, der skal gentages i.bat-filen men som er forskellige fra.bat-fil til.bat-fil!? set thisjob=hejverden Lokal environment - variable Kun ét sted i selve.bat-filen Men også.bat-filens navn skal vedligeholdes :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\%thisjob%.sas" -log "..\Logs\%thisjob%.log" -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS-program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- "%sasexe%" -sysin "..\Utility\_scanlog.sas" -log "..\Utility\_scanlog.log" -noautoexec -sysparm "%thisjob% 0" -emailsys SMTP -emailhost smtpsrv03.yourcompany.com -emailport 25 Bemærk: Linjeskift kun vist af hensyn til læselighed!
Hvad med ting, der skal gentages i.bat-filen men som er forskellige fra.bat-fil til.bat-fil!? set thisjob=%~n0 %~n0 hejverden %~x0.bat %~p0 \en\elleranden\sti\ %~d0 C: %~f0 (alt) :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\%thisjob%.sas" -log "..\Logs\%thisjob%.log" -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS-program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- "%sasexe%" -sysin "..\Utility\_scanlog.sas" -log "..\Utility\_scanlog.log" -noautoexec -sysparm "%thisjob% 0" -emailsys SMTP -emailhost smtpsrv03.yourcompany.com -emailport 25 Nu har alle.bat-filerne samme indhold!
Centralisering af jobkaldlogikken I én template.bat-fil _runsasjob.bat BridgeTables.bat, hejverden.bat, UpdateFacts.bat etc. _runsasjob.bat "%~f0" set thisjob=%~n1 :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\%thisjob%.sas" -log "..\Logs\%thisjob%.log" -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS-program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- "%sasexe%" -sysin "..\Utility\_scanlog.sas" -log "..\Utility\_scanlog.log" -noautoexec -sysparm "%thisjob% 0" -emailsys SMTP -emailhost smtpsrv03.yourcompany.com -emailport 25 Bemærk: Linjeskift kun vist af hensyn til læselighed!
_scanlog.sas-programmet Inspiration til hvordan det kan skrues sammen (1/2) Program der med datastep læser en.log-fil igennem, hvis navn er specificeret via -sysparm Leder efter spor af værste tilstand i loggen: 1. NOTE: [&_environment.] 2. WARNING: 3. Stderr 4. ERROR: 5. ikke-afsluttet logfil (mangler: NOTE: The SAS System used: ) Forsøger at sende e-mail med loggen, såfremt det værste konstaterede problem er værre end, hvad der er erklæret OK for det pågældende job
_scanlog.sas-programmet Inspiration til hvordan det kan skrues sammen (2/2) Hvis e-mails fra systemet er reglen snarere end udtagelsen, bliver administrator blind over for, hvornår der skal handles Det er vigtigt, at job er robuste, således at fejl kun opstår undtagelsesvist _SCANLOG skal kunne ignorere uundgåelige (forventede) advarsler og fejlbeskeder Se (i de fleste logs) bort fra lejlighedsvise advarsler om f.eks. forestående licensudløb Der er ofte nogle projektspecifikke ting, som det er relevant at kode ind Der er ikke erfaring for, at one size fits all.
Hvordan gør man? (Endelig en agenda punkt for punkt!) Start af ikke-interaktiv SAS samt scheduleret kørsel.bat-filer Windows Scheduler Lad os kigge loggen igennem for fejl m.v.! Environment variables Fornuftig organisering af filer Burde vi ikke have logfiler for de sidste N kørsler? Afvikling af flere forskellige job Udstedelse af OS-direktiver fra SAS Afsluttende bemærkninger
Styr på log-filerne Ikke alle fejl opdages samme dag, de er indtruffet! Tidsstemplede udgaver af logs fra jobkørsler de seneste N dage Automatisk sletning af ældre logfiler Seneste udgave af logfilen for hvert enkelt job Bliver liggende forever indtil næste kørsel af samme job
Styr på logfilerne Hvordan? Samtidig brug af -LOG og -ALTLOG options ved opstart af SAS Systemet Den ene til den ikke-tidsstemplede logfil Den anden til den tidsstemplede logfil Konstruktion af passende tidsstempel på basis af %date% og %time% inde i.bat-filen
Styr på logfilerne Sådan! _runsasjob.bat set timestamp=%date%:%time% set timestamp=%timestamp:-=% set timestamp=%timestamp:/=% set timestamp=%timestamp::=% set timestamp=%timestamp:~4,4%%timestamp:~2,2%%timestamp:~0,2% %timestamp:~8,2%%timestamp:~10,2%%timestamp:~12,2% set thisjob=%~n1 :: ------------------------------------------------- :: Kald af primært program. :: ------------------------------------------------- "%sasexe%" -sysin "..\SASPGM\%thisjob%.sas" -log "..\Logs\Recent\%thisjob%.log -altlog "..\Logs\History\%thisjob%_%timestamp%.log -autoexec "..\Utility\autoexec.sas" :: ------------------------------------------------- :: Kald af SAS -program til scanning af log fra :: kørsel af det primære program. :: ------------------------------------------------- (...) Bemærk: Linjeskift kun vist af hensyn til læselighed!
Hvordan gør man? (Endelig en agenda punkt for punkt!) Start af ikke-interaktiv SAS samt scheduleret kørsel.bat-filer Windows Scheduler Lad os kigge loggen igennem for fejl m.v.! Environment variables Fornuftig organisering af filer Burde vi ikke have logfiler for de sidste N kørsler? Afvikling af flere forskellige job Udstedelse af OS-direktiver fra SAS Afsluttende bemærkninger
Scheduleret afvikling af flere job Hvad skal man være opmærksom på? job udgør typisk en form for netværk: Nogle job kan/må/bør ikke startes, førend et eller flere forudgående job er afsluttet Andre job kan godt få lov at køre parallelt men det giver ikke nødvendigvis bedre performance Forskellige typer forudsætninger, der måske skal være på plads, førend et SAS -job kan køres: Tidspunkt ( Det skal være weekend, Det skal være kl. 2 om natten ) Data fra eksterne datakilder skal være opdateret Andre job, der opdaterer de data, jeg læser, skal være fejlfrit afsluttet
Scheduleret afvikling af flere job Hvad er mulighederne? En avanceret scheduler, som kan det hele Se eksempler på http://en.wikipedia.org/wiki/job_scheduler Task Scheduler under Windows Er altid lige ved hånden men understøtter kun tidspunkt som start-trigger Man kan lægge hvert job ind enkeltvist med fast starttidspunkt For at undgå samtidig kørsel af conflicting jobs må der generelt lægges rigeligt med luft ind mellem job. I det totale jobflow spildes en masse tid på at vente Heldigvis er SAS Systemet jo også lige ved hånden og det er alsidigt nok til, at vi kan lave vores egen avancerede jobstyringslogik
Simpel scheduler og SAS Forskellige strategier Én.bat-fil pr. job Hver.bat-fil individuelt scheduleret til fast (typisk dagligt) starttidspunkt. Én eneste (statisk).bat-fil, som indeholder kald til opstart af de enkelte job. Denne ene.bat-fil scheduleret til fast (typisk dagligt) starttidspunkt. Én statisk.bat-fil, som starter SAS-program, der dynamisk danner en temporær.bat-fil. Denne kaldes efterfølgende, og slettes efter kørsel. 1 2 3 Spildtid i flow Risiko for utilsigtede joboverlap ikke robust nok Parallelitet er i en vis forstand lettere, hvis spildtiden er acceptabel Forudsætningstjek kan bygges ind i jobkoden eller autoexec Adgangstjek vigtigt i alle tilfælde! Behov for speciel mekanisme til ad hoc-opstart af et enkeltjob 4 Én statisk.bat-fil, som starter SAS-program, der starter de enkelte job ét ad gangen, med mellemliggende tjek af forudsætninger.
Simpel scheduler og SAS Det smarte samspil ( strategierne 2-4) Vi kan nøjes med at schedulere ét job til at starte på et fast tidspunkt hver dag Det bagvedliggende SAS -program kan så skrues sammen til at Tjekke om eksterne datakilder synes opdaterede evt. SLEEP() og gentjekke, indtil alt er OK Starte de primære job i den rigtige rækkefølge Tage hensyn til dato/tid, andre job, eget jobs seneste exitkode m.v.
Brug af returkoder Fra SAS til Windows I en.bat- eller.cmd- fil kan vi henvise til %ERRORLEVEL% Denne kan påvirkes inde fra SAS ved brug af ABORT statement eller ved at overskrive makrovariablen syscc Se Return Codes and Completion Status i appendiks til SAS Companion for Windows Accept af ABORT statements og/eller SAS-kode, som ændrer SYSCC (ved at komme med fejl/advarsler), kan kompromittere muligheden for at anvende en fast, obligatorisk afslutning på alle job
Start af sekventielle job inde fra SAS Brug af CALL SYSTEM (masser af logik til oprettelse af work.jobs2runnow mv) %let primarypath=%sysfunc(sysget(primarypath)); options noxwait xsync; * XSYNC sikrer sekventiel kørsel!; data _null_; set work.jobs2runnow_allinonerow; if (run_extractfromdb) then call system('"'!!"&primarypath.\_runsasjob.bat "!! '" "extractfromdb"' ); if (run_builddimensiontables) then call system('"'!!"&primarypath.\_runsasjob.bat "!! '" "builddimensiontables"' ); (etc.) run;
Start af sekventielle job inde fra SAS Brug af dynamisk.bat-fil og X statement data _null_; set work.jobs2runnow end=enddata; file "&primarypath.\ jobcontrol_&sysdate9..bat"; run; length str $400; str= call "'!!"&primarypath.\_runsasjob.bat "!! '" "'!!trim(job2run)!!'"'; put str; if (enddata) then call symput('xcmd', "x '"!!'"'!! "&primarypath.\ jobcontrol_&sysdate9..bat"!! '"'!!"'" ); &xcmd.; Den midlertidige.bat-fils navn gøres unikt for at undgå forveksling med tidligere dannede Evt. sekundært X statement til at slette.bat-fil efter kald/kørsel
Parallelle job er sværere! Hvad kan man overhovedet gøre? Start parallelle processer fra.bat-fil ved brug af direktiv a la start cmd /C hejverden.bat Efter at have startet et passende antal parallelle SAS -job, startes et særligt program call afvent_klar.bat (evt. parametre) AFVENT_KLAR skal afvente, at én eller flere af de startede, parallelle SAS-job er afsluttet og først da returnere kontrol til den kaldende.bat-fil, som så kan kalde flere job filename tasks pipe "tasklist /V /FO LIST"; er en mulighed evt. i kombination med &sysjobid
Hvordan gør man? (Endelig en agenda punkt for punkt!) Start af ikke-interaktiv SAS samt scheduleret kørsel.bat-filer Windows Scheduler Lad os kigge loggen igennem for fejl m.v.! Environment variables Fornuftig organisering af filer Burde vi ikke have logfiler for de sidste N kørsler? Afvikling af flere forskellige job Udstedelse af OS-direktiver fra SAS Afsluttende bemærkninger
Pas på! Faldgruber i forbindelse med batch-job Bare fordi job køres om natten eller i weekenden, er det ingen undskyldning for poorly performing code Maskinressourcer (diskplads, CPU cycles, hukommelse ) er også begrænsede om natten Dine job kan være i konkurrence med andres job alle skal gerne kunne nås Centralisering uden centralt overblik Rettighedsproblemer batch-brugers rettigheder vs. udviklerens rettigheder Problemer, hvis conflicting jobs køres samtidig (inkl. adskillige instanser af samme job)
Tjekliste Hvis du opbygger et miljø til batch-afvikling af SAS Generelle.bat-filer til opstart af primært job/program Automatisk scanning af logfil for fejl Arkivering af logfiler fra flere tidligere kørsler af hvert job Udviklingsstandarder og tilhørende mekanismer til at hindre, at konfliktende job-instanser kører samtidig Evt. et konfigurerbart job til oprydning af gamle filer, bl.a. historiske logfiler
Lars L. Andersson Lars.L.Andersson@sdk.sas.com