我有两台Windows机器,都安装了R。我试图使用一个作为主人和药膏,以加快我的数据处理。我将总共有12个内核来运行脚本,我使用ssh来实现这一目标。
我正在使用下面的示例代码以主从方式运行我的脚本,如下所述: 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
我尝试过上面连接的不同变体,它会产生类似的错误。它是图书馆中的一个错误吗?
答案 0 :(得分:0)
错误消息显示它尝试运行ssh
。退出代码127
告诉我们找不到ssh
命令。您可以通过调用:
> 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。