2017-01-13 45 views
1

我试图在本地主机上完美工作并行运行R.现在我想切换到多节点设置并在同一网络中创建多个虚拟机。然而,当我试图设置群集时,出现以下错误:由于“无法打开连接”错误,R无法进行集群(多节点)错误

Error in socketConnection(master, port = port, blocking = TRUE, open = "a+b", : 
cannot open the connection 
Calls: <Anonymous> ... doTryCatch -> recvData -> makeSOCKmaster -> 
socketConnection 
In addition: Warning message: 
In socketConnection(master, port = port, blocking = TRUE, open = "a+b", : 
ubuntu-r-node1:11056 cannot be opened 

最小的可重复的例子:

library("parallel") 
cl <- makeCluster(c(rep("192.168.42.26",2),rep("192.168.42.32",2)),outfile = "") 

我也曾尝试刚刚开放套接字在本地主机上,它失败以及(但在本地主机集群只适用),与同样的错误信息:

socketConnection("localhost", port = 11056, blocking = TRUE, open = "a+b") 

只有当我添加服务器= TRUE选项,socketConnection的作品,但我不确定这个选项是否适合makeCluster以及如何设置它。

我已经全新安装了Ubuntu Server 16.04,iptables规则为空(ACCEPT all),ssh可以双向运行,所以我不知道为什么它不起作用。

回答

1

当工作人员尝试连接到主进程时,可能是因为至少有一名工人无法解析主服务器的主机名(在您的示例中为“ubuntu-r-node1”),因此出现socketConnection错误。主机的主机名默认使用Sys.info()['nodename']确定,如果有任何工作人员无法解析此名称,他们将无法创建与主机的套接字连接,并且makeCluster将挂起。

一个常用的解决这个问题是使用makeCluster“主”选项来指定主正在执行的机器的IP地址。这里有一个办法做到这一点使用nsl功能(这是不是适用于Windows)来查找主服务器的主机名上的主,而不是工人:

cl <- makePSOCKcluster(c(rep('192.168.42.26', 2), 
         rep('192.168.42.32', 2)), 
      master=nsl(Sys.info()['nodename']), 
      outfile='') 

通过为工人和主人都指定IP地址,您在DNS问题上遇到的问题要少得多。在这个例子中,主人将通过ssh'ing启动员工'192.168.42.26'和'192.168.42.32',并且工人将使用socketConnection连接回主人,返回的值为nsl(Sys.info()['nodename'])

请注意,如果主站有防火墙,则makeCluster“端口”选项也很重要,因为默认情况下端口是在11000到11999范围内随机选择的。

0

看来,DNS也应该在两个方向上工作。

例如,如果在我的例子第一主机(192.168.42.26)将有一个名称“主机1”和第二主机(192.168.42.32)“主机2”,那么这两个

ssh host1 

(从主机2)

ssh host2 

(来自主机1)

应该工作运行的R型聚类。

1

如果这里涉及到,那么作为替代防火墙的问题:

library("parallel") 
workers <- c(rep("192.168.42.26",2), rep("192.168.42.32",2)) 
cl <- makeCluster(workers, outfile = "") 

这相当于:

cl <- makePSOCKcluster(workers, outfile = "") 

,你可以尝试使用:

library("future") 
cl <- makeClusterPSOCK(workers, revtunnel = TRUE, outfile = "", verbose = TRUE) 

后者将设置一个所谓的反向SSH隧道,该隧道将成为传出SSH连接的“内部”部分从主人到工人。例如,如果防火墙阻止工作人员连接回主设备parallel::makePSOCKcluster(),因为端口范围被阻止,那么future::makeClusterPSOCK(..., revtunnel = TRUE)可以解决该问题。该verbose=TRUE输出应显示是这样的:

Starting worker #1 on '192.168.42.26': 'ssh' -R 11356:localhost:11356 192.168.42.26 "'Rscript' --default-packages=datasets,utils,grDevices,graphics,stats,methods -e 'parallel:::.slaveRSOCK()' MASTER=localhost PORT=11356 OUT= TIMEOUT=2592000 XDR=TRUE" 
Waiting for worker #1 on '192.168.42.26' to connect back 
Connection with worker #1 on '192.168.42.26' established 
[...] 

什么这表明的是,据这名工人192.168.42.26知道,它连接回它认为在同一台机器(MASTER=localhost:11356)上运行的主进程,这发生的原因是反向SSH隧道(-R 11356:localhost:11356)通过SSH连接将该机器的端口映射回主站。

如果反向隧道的方法不适合你,我想你要问您的系统管理员,详细了解哪些端口被封锁等

我希望这是有道理的。

+1

谢谢你的回答。问题已经解决了(是DNS问题,我把它作为一个单独的答案发布),但是您提供的信息确实非常有用,我不知道有关revtunnel选项。 –

相关问题