R脚本在使用并行库的机器集群上

时间:2017-03-17 20:11:47

标签: r ssh parallel-processing rstudio remote-access

我有两台Windows机器,都安装了R。我试图使用一个作为主人和药膏,以加快我的数据处理。我将总共有12个内核来运行脚本,我使用ssh来实现这一目标。

  1. FreeSSHD已安装在两台机器上
  2. 已在两台机器上安装了Putty
  3. 我可以远程SSH到两台机器完全没问题。
  4. 我正在使用下面的示例代码以主从方式运行我的脚本,如下所述: http://www.win-vector.com/blog/2016/01/running-r-jobs-quickly-on-many-machines/

        primary <- '171.27.27.190'
        machineAddresses <- list(list(host=primary,user='james',ncore=2),list(host='173.29.50.45',user='james',ncore=4))
    
        spec <- lapply(machineAddresses,(function(machine) {rep(list(list(host=machine$host,user=machine$user)), machine$ncore)}))
        spec <- unlist(spec,recursive=FALSE)
    
        parallelCluster <- parallel::makeCluster(type='PSOCK',master=primary,spec=spec)
        print(parallelCluster)
    

    脚本只挂在R中,似乎在等待输入,我必须点击警告打印在下面。

    running command 'ssh -l james 171.27.27.190 "\"C:/Users/james/DOCUME~1/R-33~1.3/bin/x64/Rscript\" --default-packages=datasets,utils,grDevices,graphics,stats,methods -e \"parallel:::.slaveRSOCK()\" MASTER=171.27.27.190 PORT=11923 OUT=/dev/null TIMEOUT=2592000 XDR=TRUE"' had status 127 
    

    我尝试过上面连接的不同变体,它会产生类似的错误。它是图书馆中的一个错误吗?

1 个答案:

答案 0 :(得分:0)

错误消息显示它尝试运行ssh。退出代码127告诉我们找不到ssh命令。您可以通过调用:

在R中验证这一点
> Sys.which("ssh")
ssh
""

表示搜索ssh上没有PATH。现在,您很可能在Windows系统上没有ssh命令。相反,既然你提到了PuTTY,你应该有plink命令。在我使用默认设置安装PuTTY的Windows 8.1上,我得到:

> Sys.which("plink")
                           plink 
"C:\\PROGRA~1\\PuTTY\\plink.exe"

如果您仍然获得"",则需要更新PATH以包含C:\PROGRA~1\PuTTY(或者您已经安装了PuTTY的地方)。

完成上述操作后,请安装future包(我是作者):

install.packages("future")

使用未来软件包而不是并行软件的原因是它(i)提供了详细的输出,但更重要的是,它(ii)使用反向SSH隧道,避免了在远程机器尝试连接时与防火墙等的麻烦到你的本地机器(它需要做)。

查看以下内容是否有效:

> library("future")
> cl <- makeClusterPSOCK("171.27.27.190", user = "james", 
          rshcmd = c("plink", "-ssh", "-i", "C:/Users/james/.ssh/putty.ppk"),
          homogeneous = FALSE, verbose = TRUE)
Starting worker #1 on ‘171.27.27.190’: "plink" "-ssh" "-i" "C:/Users/james/.ssh/putty.ppk" -R 11671:localhost:11671 -l james 171.27.27.190 "\"Rscript\" --default-packages=datasets,utils,grDevices,graphics,stats,methods -e \"parallel:::.slaveRSOCK()\" MASTER=localhost PORT=11671 OUT= TIMEOUT=2592000 XDR=TRUE"
Waiting for worker #1 on ‘171.27.27.190’ to connect back
Connection with worker #1 on ‘171.27.27.190’ established

您会看到不同于11671的端口号,但是看起来应该是相同的。

请注意,您需要在本地计算机和远程计算机之间设置SSH密钥身份验证。这就是"-i", "C:/Users/james/.ssh/putty.ppk"选项的含义;它告诉plink -ssh使用您的私有 SSH密钥连接到远程计算机。远程计算机必须列出 public SSH密钥。没有办法解决这个问题 - 您需要能够在不输入密码的情况下SSH到远程计算机(这也是并行程序包的工作方式)。您可以使用PuTTYgen生成公钥 - 私钥SSH密钥对。因此,如果您还没有设置此功能,请确保您可以使用PuTTY自行完成此操作。只有当它工作时,尝试从R。

访问它