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

dlv*_*dlv 4 parallel-processing r cluster-computing snowfall snow

我在局域网上有两台服务器,全新安装了Centos 6.4 minimal和R 3.0.1.两台计算机都安装了doParallel,snow和snowfall软件包.

服务器可以很好地互相ssh.

当我尝试在任一方向上创建集群时,我会收到密码提示,但输入密码后,它会无限期挂起.

makePSOCKcluster("192.168.1.1",user="username")
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

编辑:

我也尝试在上面提到的计算机上调用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
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

Ste*_*ton 8

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

makePSOCKcluster("192.168.1.1",user="username",outfile="")
Run Code Online (Sandbox Code Playgroud)

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

makePSOCKcluster("192.168.1.1",user="username",outfile="",manual=TRUE)
Run Code Online (Sandbox Code Playgroud)

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

如果makePSOCKcluster在执行指定的命令后没有响应,则表示该worker无法连接到主进程.如果工作人员未显示任何错误消息,则可能表示存在网络问题,可能是由于防火墙阻止了连接.由于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 
Run Code Online (Sandbox Code Playgroud)

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

node03$ nc node01 11234
Run Code Online (Sandbox Code Playgroud)

主进程应立即返回消息:

socket cluster with 1 nodes on host ‘node03’
Run Code Online (Sandbox Code Playgroud)

而netcat应该不显示任何消息,因为它正在从套接字连接中静静地读取.

但是,如果netcat显示消息:

nc: getaddrinfo: Name or service not known
Run Code Online (Sandbox Code Playgroud)

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

如果netcat立即返回,则可能表示它无法连接到指定的端口.如果它在一两分钟后返回,则可能表明它根本无法与指定的主机通信.在任何一种情况下,检查netcat的返回值以验证它是一个错误:

node03$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

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