我在局域网上有两台服务器,分别安装了最低限度的Centos 6.4和R 3.0.1。这两台计算机都安装了doParallel、snow和snow软件包。
服务器可以很好地通过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
创建集群对象时,您可以先将"outfile"选项设置为空字符串:
makePSOCKcluster("192.168.1.1",user="username",outfile="")
这允许您在终端中看到来自工作人员的错误消息,这有望为问题提供线索。如果这没有帮助,我建议使用手动模式:
makePSOCKcluster("192.168.1.1",user="username",outfile="",manual=TRUE)
这将绕过ssh,并显示要执行的命令,以便在单独的终端中手动启动每个工作程序。这可能会发现诸如未安装的R包之类的问题。它还允许您使用您选择的任何调试工具来调试工作人员,尽管这需要一些工作。
如果makePSOCKcluster
在执行指定命令后没有响应,则表示工作进程无法连接到主进程。如果工作程序没有显示任何错误消息,则可能表明存在网络问题,可能是由于防火墙阻止了连接。由于makePSOCKcluster
在R3.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"one_answers"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("node03", master="node01", port=11234)
来使makePSOCKcluster
工作。
如果netcat立即返回,这可能表明它无法连接到指定的端口。如果它在一两分钟后返回,则可能表明它根本无法与指定的主机通信。在任何一种情况下,检查netcat的返回值以验证它是否为错误:
node03$ echo $?
1
希望这能给你足够的关于这个问题的信息,你可以从网络管理员那里得到帮助。