在Windows 7上的R 2.14.1中工作
使用R中的并行程序包,我正在尝试利用我的网络上可用的本地计算机以外的核心,我连接的所有远程主机都是相同的Windows计算机。
这些命令的基本形式就是建立连接。
library(parallel)
#assume 8 cores per machine
cl<-makePSOCKcluster(c(rep("localhost", 8), rep("otherhost", 8)))
当然,尝试调试这些东西可能相当棘手,但这就是我所处的位置。
如果我指定手动= TRUE标志如下
cl<-makePSOCKcluster(c(rep("localhost", 8), rep("otherhost", 8)), manual=TRUE)
连接到远程主机并运行并行进程没有问题。计算机与我正在使用的计算机具有相同的设置。但是,如果未设置此手动标志,则连接命令将挂起。
这似乎向我表明,由于手动标志绕过ssh以建立与主机的连接,因此当手动= FALSE时,该ssh是问题。
目前无法保证远程计算机上有ssh。问题是,鉴于我拥有远程主机的所有相关Windows登录信息,并且我无法更改远程计算机上的设置,如何在R 中将程序包并行连接到远程计算机上的核心指定manual = true?
或者,如果必须安装ssh才能实现此目的,让我们假设所有计算机都有ssh。如何在没有绕过ssh的情况下连接远程计算机上的核心?
如果您需要更多信息,请告诉我,我很感激时间。
14年8月26日
感谢Steve Weston的见解。我将提供一个更新,其中包含我使用的确切工具和设置,以便在系统启动并运行时使其正常工作。
如果您还有其他任何内容需要添加,可以通过makePSOCKcluster从Windows机器远程连接到Windows机器的最佳路径,其中手动标志设置为FALSE,请随意发表评论或发布。< / p>
答案 0 :(得分:3)
使用manual=FALSE
创建PSOCK群集时,在远程计算机上启动工作人员的唯一方法是使用&#34; ssh&#34;,&#34; rsh&#34;或其他命令 - 行兼容,例如&#34; plink&#34;来自PuTTY。原因是makePSOCKcluster使用&#34;系统&#34;启动远程工作者。函数执行以下形式的命令:
ssh -l user otherhost '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=myhost PORT=10187 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
您可以通过查看并行程序包中snowSOCK.R文件中newPSOCKnode函数的源代码来确认这一点。
为此,ssh-compatible命令必须在本地计算机上可用,并且必须在每台远程计算机上运行相应的ssh守护程序,否则makePSOCKcluster将挂起。我发现在Windows上安装一个好的,工作正常的ssh守护进程是困难的部分。
不幸的是,manual=TRUE
通常是在多台Windows机器上创建PSOCK群集的最简单方法。
答案 1 :(得分:0)
帮助大家,我遇到了同样的问题,我设法解决了这个问题。 2018年6月,当我写这个答案时,我的操作系统是Windows 10,R版本是3.2.2。令人惊讶的是,这个问题在4年后仍然存在。我希望它可以在以下版本中修复。
在继续之前,请确保您可以使用ssh访问cmd中的服务器。我没有在我的代码中输入任何密码,因为我有私钥,你不需要这样做,你会在以后看到原因。
解决问题
由于函数makePSOCKcluster在手动启动worker时起作用,我的第一个尝试是让manual = TRUE,看看输出是什么。这是我的结果:
machineAddresses <-list(list(host='192.168.1.220',user='jeff'))
cl <- makePSOCKcluster(spec,manual = F)
> Manually start worker on 192.168.1.220 with
"C:/PROGRA~1/R/R-32~1.2/bin/x64/Rscript" -e
"parallel:::.slaveRSOCK()" MASTER=DESKTOP-U5JA32O PORT=11756
OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
好的,这是第一个问题。 Rscript位置不正确(服务器中Rscript的位置)。通常,它位于C:\ Program Files中。在我的服务器是C:\ Program Files \ R \ R-3.2.2 \ bin。所以我们需要通过添加更多选项来纠正它们,以告诉这个愚蠢的代码,其中Rscript是:
machineAddresses <-list(list(host='192.168.1.220',
user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript"))
修复目录问题后,您会发现代码仍然永远挂起。然后我们需要检查是否可以手动访问R中的服务器,我的代码是:
system("ssh jeff@192.168.1.220")
> GetConsoleMode on STD_INPUT_HANDLE failed with 6
老实说,我不知道这个错误意味着什么,但我们只需要解决这个问题。在@Steve Weston的启发下,我决定使用PuTTY,所以我安装它,并将我的代码更改为:
machineAddresses <-list(list(host='192.168.1.220',user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript",rshcmd="plink -pw qwer"))
选项-pw表示密码。因为我是PuTTY的新手,所以我不知道如何让私钥在PuTTY中自动运行。因此,我用最简单的方法来处理:输入你的密码!上面的代码等同于cmd中的以下内容:
plink -pw qwer jeff@192.168.1.220 Rscript -e parallel:::.slaveRSOCK() MASTER=DESKTOP-U5JA32O PORT=11063 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
如果我们手动创建工作人员,这正是我们要做的。对于像我这样的新手,你需要在环境变量的PATH中添加PuTTY目录来运行plink。以下是我的最终代码:
machineAddresses <-list(list(host='192.168.1.220',user='jeff',rscript="C:/Program Files/R/R-3.3.2/bin/Rscript",rshcmd="plink -pw qwer"))
cl <- makePSOCKcluster(machineAddresses,manual = F)
我毫无问题地运行它。总之,函数makePSOCKcluster犯了两个错误:
假设服务器中有一个错误的R目录(至少它应该与我的本地计算机假设相同的目录,但它没有!我不知道那个奇怪的目录来自哪里)
使用ssh命令启动连接,这在R中不起作用。它适用于cmd,但不适用于R.我不知道原因。
如果仍然无法使用makePSOCKcluster,这里有一个技巧:尝试首先使用系统函数连接到R中的服务器。它可以为您提供一些错误代码,可以指示您问题所在。这是我的调试代码:
system("plink -pw qwer jeff@192.168.1.220 Rscript -e parallel:::.slaveRSOCK() MASTER=DESKTOP-U5JA32O PORT=11063 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE")