R can';t打开并行集群的套接字
我试图使用R can';t打开并行集群的套接字,r,parallel-processing,R,Parallel Processing,我试图使用并行包,发现makeCluster无法完成。我在newPSOCKnode中跟踪了挂起到以下行: con <- socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, open = "a+b", timeout = timeout) 所以除了一个不同的端口号之外,我认为一切都匹配 下一个技巧:我打开一个shell并运行netsh advfirewall firewall add
并行
包,发现makeCluster
无法完成。我在newPSOCKnode
中跟踪了挂起到以下行:
con <- socketConnection("localhost", port = port, server = TRUE,
blocking = TRUE, open = "a+b", timeout = timeout)
所以除了一个不同的端口号之外,我认为一切都匹配
下一个技巧:我打开一个shell并运行netsh advfirewall firewall add rule name=“Open Port 11017”dir=in action=allow protocol=TCP localport=11017
,得到一个“OK”响应。
我运行了netstat-a-n
并找到以下行:
TCP 0.0.0.0:11017 0.0.0.0.0:0监听
但是运行makePSOCKcluster
仍然挂起在同一位置
下一步:
我尝试从命令行运行R
(通过cygwin bash),得到的错误消息是loadhistory(file)中的error:没有可用的历史机制
执行暂停
,然后-C将我返回到R提示符。测试1:明显的命令有效吗
library(parallel)
cluster <- makePSOCKcluster("localhost")
parSapply(cluster, 1:5, sqrt)
stopCluster(cluster)
您得到的是相同的消息吗?您所描述的是PSOCK集群的典型问题:
makeCluster
挂起。由于许多原因,它可能会挂起,因为它必须创建所有进程,称为“worker”进程,这些进程将执行“集群”的实际工作,其中包括使用Rscript命令启动新的R会话,Rscript命令将执行.slaveRSOCK
函数,它将创建一个回主机的套接字连接,然后执行slaveLoop
函数,最终执行主机发送给它的任务。如果启动任何工作进程时出现任何错误(相信我:很多工作进程都可能出错),那么主进程将在执行socketConnection
时挂起,等待工作进程连接到主进程,即使该工作进程可能已死亡或从未成功创建
对于许多失败场景,使用outfile
参数是很好的,因为它经常揭示导致工作进程死亡的错误,从而导致主进程挂起。但如果没有显示任何信息,我将进入手动模式。在手动模式下,主机打印命令以启动每个工作程序,而不是执行命令本身。这是更多的工作,但它给了您完全的控制,如果需要,您甚至可以调试到worker中
下面是一个例子:
> library(parallel)
> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt')
Manually start worker on localhost with
'/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
在该R会话中,您可以在.slaveRSOCK
函数上设置断点,然后执行它:
> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()
现在您可以开始单步执行代码,可能会在slaveLoop
和makeSOCKmaster
函数上设置断点。在您的情况下,我假设它将挂起尝试创建套接字连接,在这种情况下,您的问题的标题将是合适的
有关此类问题的更多信息,请参阅
更新
现在这个问题已经解决了,我可以添加两个调试makePSOCKcluster
问题的提示:
- 检查.Rprofile中的任何内容是否仅在交互模式下工作
- 在Windows上,使用Rterm命令而不是Rgui,以便更容易看到错误消息和使用
输出的结果outfile=''
- 好吧,我不觉得自己是个十足的白痴吗
我回到了“软件调试的三个R”(重试、重新启动、重新加载),在重新启动我的系统并成功执行手动工作者启动后,我尝试创建一个带有
manual=FALSE
的集群,并立即获得成功
编辑:我应该明确指出,将我的.Rprofile
从loadhistory()
更改为if(interactive())loadhistory()
对于成功使用集群
功能至关重要
我非常感谢里奇和史蒂夫提出的所有有益的意见和建议。我确实在“幕后”学到了很多东西,所以这次经历至少对我来说是非常积极的
(因此,我不知道Windows操作系统的什么东西或中断的调用一直在妨碍我,但结局很好一切都很好)在
makeCluster(…,Rscript=)
中指定Rscript.exe
的适当路径阻止了我挂起该函数。“不过,那是很久以前的事了。”本巴恩斯试过——不行。我检查了一下;仍然正确生成了默认路径。主机挂起在那里,因为它正在等待刚刚开始连接回它的工作进程。真正的问题几乎肯定在工人身上。尝试使用outfile选项查看工作进程是否抛出错误,或者是否由于防火墙而挂起。查看对makeCluster
的调用会很有帮助,因为这样可以控制工作进程的启动方式。@SteveWeston我试过了;没有错误(或者至少没有创建任何文件)生成延迟,尝试debug(socketConnection)
会让我挂起R,直接从全局环境运行问题中的代码段也是如此。请参阅上面的myls.str
dump。顺便说一句,这里没有命令吗(无论是在cmd.exe中还是在cygwin bash窗口中,我都可以用来查看我的端口状态?@CarlWitthoft:在这里查找被阻止的端口。我将我的突袭添加到netstat
和netsh
。我得到以下信息:`C:/Users/carl.witthoft/Documents/R/R-3.0.1/bin/x64/Rscript'-e'parallel::::.slaveRSOCK()'MASTER=localhost PORT=11017 OUT=mylog.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE.External2中的错误(C_loadhistory,文件):“loadhistory”只能在Rgui和Rterm调用中使用:loadhistory执行已暂停。我希望这意味着我需要修改.Rprofile以避免loadhistory调用。我会继续下去。好的,从中删除loadhistory
。Rprofile
可以避免暂停。但是,bash终端和Rgui都不会返回。我注意感谢你的帮助,如果我能解决的话
> library(parallel)
> cl <- makePSOCKcluster(1, manual=TRUE, outfile='log.txt')
Manually start worker on localhost with
'/usr/lib/R/bin/Rscript' -e 'parallel:::.slaveRSOCK()' MASTER=localhost
PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
$ R --vanilla --args MASTER=localhost PORT=10187 OUT=log.txt TIMEOUT=2592000 METHODS=TRUE XDR=TRUE
> debug(parallel:::.slaveRSOCK)
> parallel:::.slaveRSOCK()