开始使用 MP Connect 进行 SAS 并行处理

Getting started with SAS parallel processing using MP Connect

我想了解 MPConnect 以及如何使用它进行并行处理。

作为一个简单的例子,我启动了一个永远打印 "Hello World!" 的会话和另一个打印 "Bye World!" 的会话。我说 "waitfor any" 和 "rget" 并且我希望日志中出现 "Bye World!",因为 "Hello World!" 将永远持续下去,而 "Bye World!" 已经完成。不幸的是,这不起作用。

一般来说,我很难从远程提交的任务中检索输出。

option cpucount=4 sascmd="!sascmd" autosignon;

rsubmit task1 wait=no;

    data _null_;
        do while(1);
        put "Hello World!";
        end;

    run;

endrsubmit;


rsubmit task2 wait=no;

    data _null_;
        put "Bye World!";
    run;

endrsubmit;


waitfor _any_;
rget;

signoff task1;
signoff task2;

问题似乎是,当您有同步进程时 运行ning 它们彼此完全断开连接。即使您只是在等待快速 task2 完成后再继续:

rsubmit task2 wait=no;
    data _null_;
        put "Bye World!";
    run;
endrsubmit;

SAS 还需要 task1 才能完成最后的 rget:

rsubmit task1 wait=no;
    data _null_;
        do while(1);
        put "Hello World!";
        end;
    run;
endrsubmit;

我认为发生的事情是 SAS task2 满足 waitfor _any_ 条件并且能够在 task2 之后进行处理。然而 rget 需要每个(完成的)进程的最终日志文件才能将它们合并到客户端会话日志 window。

查看 SAS 文档的详细信息部分 here:

编辑:

再试一试,您可以使用统一的库名测试它们之间的连接(每个进程都有自己独特的工作库名,因此它们不会相互冲突):

根据需要在客户端计算机上分配库名和选项:

libname testlib 'C:/test' ;
option cpucount=4 sascmd="!sascmd" autosignon;

并行定义两个进程运行:

* Process 1 ;
rsubmit task1 wait=no;
libname testlib 'C:/test' ;
data testlib.test1 ;
  do i=1 to 1000 ;
    do j=1 to 1000;
      output ;
    end ;
  end ;
run ;
endrsubmit;

* Process 2 ;
rsubmit task2 wait=no;
libname testlib 'C:/test' ;
data testlib.test2 ;
  do i=1 to 1000 ;
    output ;
  end ;
run ;
endrsubmit;

然后您可以使用以下代码 运行,而 process1 仍然是 运行ning,但它将能够访问 process2 的输出数据集:

* Wait for either of the above processes and the process remaining code;
waitfor _any_;

proc sql noprint ;
  select sum(i)
  into :result
  from testlib.test2 
;quit ;

%put *** SUM OF TEST2 IS: &result *** ;

问题是,正如您所说,TASK1 永远设置为 运行。具体是语句

signoff task1;

这是导致您遇到特定问题的原因。正如你所说的提交过程等待不确定的过程结束,然后签字...

如果你有

signoff task2;
killtask task1;

您会看到您确实使用 RGET 从 TASK2 收集日志信息(SIGNOFF 语句在没有 RGET 的情况下也会收集)。在这种情况下,来自 TASK1 的信息丢失了,但是使用已经提到的选项 (LOG="task1.log"),您可以单独恢复信息。

在这种情况下,RGET 语句不会等待一切完成。它将尽可能地从请求时已完成的任何任务中收集信息,除非您特别请求 RGET TASK1,在这种情况下它将在那里暂停。