SAS Выполнение двух шагов данных параллельно - PullRequest
0 голосов
/ 10 октября 2019

Это мой код SAS для параллельного выполнения 2 шагов данных. Я получаю эту ошибку: * Не удается найти узел TCP «TASK1». Когда я запускаю этот код не параллельно, он работает. Но мне нужно, чтобы он работал параллельно, потому что фактические наборы данных - это сотни миллионов записей.

    %include 'C:details.txt';
    %let myserv=10.xxx.xx.xxx  4052;
    filename rlink 'C:\Users\id\Desktop\TCPUNIX_moki.txt';
    options comamid=tcp remote=MOKI;
    signon LOKI;

   /*send passwords to remote server for RSUBMIT*;
    %SYSLPUT seid    = &seid;
    %SYSLPUT passcdw = &passcdw;

    /*Establish remote Libaries, including CDW databases as LIB*;
    RSUBMIT;
    OPTIONS NOCENTER;
    /*CDW DATABASE LIBNAME*/
    LIBNAME CDW odbc dsn=cdwsas uid=&seid pwd=&passcdw schema=cdwsa;   
    ENDRSUBMIT;

    *Add LIBNAMES to local GUI;
    LIBNAME rCDW     slibref = CDW    server = MOKI;
    LIBNAME rwork    slibref = work server = MOKI; * your remote work;

    options autosignon=yes sascmd="sas";
    rsubmit task1 wait=no sysrputsync=yes;

   /*create TASK1 SAS session to get data for 2012 */
   data rwork.Mtrdb0;
   set rcdw.MTRDB (OBS=10);
   where TAX_YR = 2012 ;                   
   run;
   /* get TASK1's WORK library path in parent session */
   %sysrput pathtask1=%sysfunc(pathname(work));
   endrsubmit;
   create TASK2 SAS session to get data for 2013 */
   rsubmit task2 wait=no sysrputsync=yes;
   data rwork.MtrdbF0_1;
   set rcdw.MTRDB_(OBS=10);
   where TAX_YR = 2013 ;                   
   run;
   %sysrput pathtask2=%sysfunc(pathname(work));
   endrsubmit;

   /*wait until both datasteps have finished */
   waitfor _all_ task1 task2;


    signoff task1;
    signoff task2;

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Эта команда работала для меня и параллельно выполняла 2 задания.

%let log= 'C:\Users\XXXXb\';

%let loc1= 'C:\Users\XXXXb\Documents\My SAS Files\9.4\q2012.sas';
%let loc2= 'C:\Users\XXXXb\Documents\My SAS Files\9.4\q2013.sas';


systask command  "sas &loc1  -log &log.log "
         taskname=sas1
         status  =stat_sas1;
systask command  "sas &loc2  -log &log.log "
         taskname=sas2
         status  =stat_sas2;
waitfor _all_ sas1 sas2;
0 голосов
/ 11 октября 2019

Рассмотрим этот подход для параллельной обработки:

Напишите ваши команды SAS для вызова SAS в файл cmd.

    data _null_ ;
       %do i = 1 %to 5;
           file workarea(job_&i..cmd) ;
           put " ""&sasroot&separator.sas"" " @ ;
           put "-sysin ""c:\temp\job_&i..sas"" " @ ;
           put %sysfunc(compbl("&generated_programs_options ")) @ ;
           put "&sasexe_options " @ ;
           put "-log ""c:\temp\logs\job_&i._&Process_Date_Formatted..log"" ";
       %end ;
   run;

Затем выполните их параллельно:

%do i = 1 %to 5 ;
    systask kill sas&i ;
    systask command "c:\temp\Job_&i..cmd" taskname=sas&i;
%end ;
waitfor _all_
...