1

我正在尝试并行运行 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 = "")

我也尝试过在 localhost 上打开套接字,但它也失败了(但 localhost 上的集群只能工作),并显示相同的错误消息:

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

仅当我添加server = TRUE选项时,socketConnection 才有效,但我不确定此选项是否适用于 makeCluster 以及如何设置它。

我全新安装了 Ubuntu Server 16.04,iptables 规则为空(全部接受),ssh 双向工作,所以我不知道为什么它不起作用。

4

3 回答 3

2

如果此处涉及防火墙问题,则可以替代:

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 隧道,这将是从 master 到 worker 的传出 SSH 连接的“内部”部分。如果防火墙阻止工作人员连接回 master 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 连接主控。

如果这种反向隧道方法对您不起作用,我认为您必须向您的系统管理员询问有关哪些端口被阻止等的更多详细信息。

我希望这是有道理的。

于 2017-03-07T01:13:21.630 回答
1

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

此问题的常见解决方法是使用makeCluster“master”选项来指定执行 master 的机器的 IP 地址。这是一种使用该nsl功能(在 Windows 上不可用)在 master 而不是 worker 上查找 master 的主机名的方法:

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

通过为 worker 和 master 指定 IP 地址,DNS 问题的问题就会少得多。socketConnection在此示例中,master 将通过 ssh'ing 到 '192.168.42.26' 和 '192.168.42.32' 来启动 worker,并且 worker 将使用返回的值连接回 master nsl(Sys.info()['nodename'])

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

于 2017-01-15T13:36:28.093 回答
0

看来,DNS 也应该双向工作。

例如,如果我的示例中的第一个主机 (192.168.42.26) 的名称为“host1”,第二个主机(192.168.42.32) 的名称为“host2”,那么两者都有

ssh host1

(来自主机 2)

ssh host2

(来自主机 1)

应该可以运行 R 集群。

于 2017-01-13T17:28:41.427 回答