R:在doParallel /降雪中制作集群挂起

Posted

技术标签:

【中文标题】R:在doParallel /降雪中制作集群挂起【英文标题】:R: making cluster in doParallel / snowfall hangs 【发布时间】:2013-07-29 04:43:33 【问题描述】:

我在 LAN 上有两台服务器,全新安装了 Centos 6.4 minimum 和 R 3.0.1。两台计算机都安装了 doParallel、snow 和 snowfall 软件包。

服务器可以通过 ssh 相互连接。

当我尝试在任一方向创建集群时,都会提示输入密码,但在输入密码后,它会无限期地挂在那里。

makePSOCKcluster("192.168.1.1",user="username")

我该如何解决这个问题?

编辑:

我还尝试在上述计算机上调用 makePSOCKcluster,该计算机的主机能够用作从机(来自其他计算机),但它仍然挂起。那么,是否可能存在防火墙问题?我还尝试使用端口 22 的 makePSOCKcluster:

> makePSOCKcluster("192.168.1.1",user="username",port=22)
Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE,  :
  cannot open the connection
In addition: Warning message:
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE,  :
  port 22 cannot be opened

这是我的 iptables

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

【问题讨论】:

你需要是root才能绑定到低数量的端口,并且你不能绑定到已经绑定到另一个进程的端口,例如sshd。 【参考方案1】:

在创建集群对象时,您可以先将“outfile”选项设置为空字符串:

makePSOCKcluster("192.168.1.1",user="username",outfile="")

这使您可以在终端中查看来自工作人员的错误消息,这有望为问题提供线索。如果这没有帮助,我建议使用手动模式:

makePSOCKcluster("192.168.1.1",user="username",outfile="",manual=TRUE)

这会绕过 ssh,并显示命令供您执行,以便在单独的终端中手动启动每个工作程序。这可以发现诸如未安装的 R 包之类的问题。它还允许您使用您选择的任何调试工具来调试工作器,尽管这需要一些工作。

如果makePSOCKcluster在你执行了指定的命令后没有响应,说明worker无法连接到master进程。如果工作人员没有显示任何错误消息,则可能表示网络问题,可能是由于防火墙阻止了连接。由于makePSOCKcluster 在 R 3.X 中默认使用随机端口,因此您应该为端口指定一个显式值并配置您的防火墙以允许连接到该端口。

要测试网络或防火墙问题,您可以尝试使用“netcat”连接到主进程。在手动模式下执行makePSOCKcluster,指定所需工作主机的主机名和本地计算机上应允许传入连接的端口:

> library(parallel)
> makePSOCKcluster("node03", port=11234, manual=TRUE)
Manually start worker on node03 with
   '/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=node01
PORT=11234 OUT=/dev/null TIMEOUT=2592000 METHODS=TRUE XDR=TRUE 

现在在“node03”上启动一个终端会话并使用“MASTER”和“PORT”的指示值作为参数执行“nc”:

node03$ nc node01 11234

主进程应该立即返回消息:

socket cluster with 1 nodes on host ‘node03’

虽然 netcat 不应该显示任何消息,因为它正在悄悄地从套接字连接中读取。

但是,如果 netcat 显示消息:

nc: getaddrinfo: Name or service not known

那么你有一个主机名解析问题。如果您能找到与 netcat 一起使用的主机名,则可以通过“master”选项指定该名称来使 makePSOCKcluster 工作:makePSOCKcluster("node03", master="node01", port=11234)

如果 netcat 立即返回,这可能表明它无法连接到指定的端口。如果它在一两分钟后返回,则可能表明它根本无法与指定的主机通信。无论哪种情况,请检查 netcat 的返回值以确认它是错误的:

node03$ echo $?
1

希望这将为您提供有关问题的足够信息,以便您可以从网络管理员那里获得帮助。

【讨论】:

谢谢。我尝试过无密码的 ssh,但没有成功。当使用manual=TRUE的makePSOCKcluster时,它告诉我运行'/usr/lib64/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=genome PORT=11494 OUT=/dev/null TIMEOUT =2592000 METHODS=TRUE XDR=TRUE 我在从站上执行的操作,但之后没有任何反应。在 OP 中添加更多线索。 当我在 master 和 slave 上禁用防火墙 (iptables) 时,我得到相同的结果,即使 manual=TRUE。 谢谢,看来我到了某个地方! selinux 和 iptables 在 master 和 slave 上都被禁用。我在主服务器上运行了'makePSOCKcluster(“192.168.1.1”,端口 = 11234)',直到我在从服务器上执行'nc 192.168.1.2 11234'为止。在slave上调用nc后,master上立即出现“socket cluster with 1 nodes on host '192.168.1.1'”。 (192.168.1.2 为主,1.1 为从)。那么,这是否意味着奴隶在被告知之前不会监听端口?如何在从站上不使用 nc 的情况下启动套接字集群?再次感谢。 @user1489048 不幸的是,实际的工作进程并没有启动:你欺骗了主进程,认为它是在你用 nc 连接到它时启动的。问:master在使用手动模式时是否显示“MASTER=192.168.1.2”?如果没有,设置“master=192.168.1.2”可能会有所帮助。 @user1489048 换句话说,尝试运行'makePSOCKcluster("192.168.1.1", master="192.168.1.2", port=11234)'。

以上是关于R:在doParallel /降雪中制作集群挂起的主要内容,如果未能解决你的问题,请参考以下文章

用降雪 R 初始化 MPI 集群

在 R 中使用降雪包做一些模拟

doParallel,集群与核心

“注销” doParallel 集群

R中doMC和doParallel的区别

在 AWS 中使用雪(和降雪)在 R 中进行并行处理