RevoScaleR函数故障转移Linux上的Rserve

问题描述:

我试图在Microsoft R客户端上运行Rserve,并通过网络连接执行RevoScaleR函数。我可以运行非RevoScaleR函数,但RevoScaleR似乎有某种兼容性问题。RevoScaleR函数故障转移Linux上的Rserve

我可以启动Rserve,连接,并将其执行代码,不涉及RevoScaleR:

> library(RSclient) 
> rsc <- RSconnect(port=30120) 
> RSeval(rsc, ' 
+ model <- lm(dist~speed, cars) 
+ predict(model, cars)') 
     1   2   3   4   5   6   7   8 
-1.849460 -1.849460 9.947766 9.947766 13.880175 17.812584 21.744993 21.744993 
     9  10  11  12  13  14  15  16 
21.744993 25.677401 25.677401 29.609810 29.609810 29.609810 29.609810 33.542219 
     17  18  19  20  21  22  23  24 
33.542219 33.542219 33.542219 37.474628 37.474628 37.474628 37.474628 41.407036 
     25  26  27  28  29  30  31  32 
41.407036 41.407036 45.339445 45.339445 49.271854 49.271854 49.271854 53.204263 
     33  34  35  36  37  38  39  40 
53.204263 53.204263 53.204263 57.136672 57.136672 57.136672 61.069080 61.069080 
     41  42  43  44  45  46  47  48 
61.069080 61.069080 61.069080 68.933898 72.866307 76.798715 76.798715 76.798715 
     49  50 
76.798715 80.731124 

但是,如果我尝试运行RevoScaleR功能,我得到一个“远程评估失败”错误:

> RSeval(rsc, ' 
+ model <- rxLinMod(dist~speed, cars) 
+ rxPredict(model, cars)') 
Error in RSeval(rsc, "\nmodel <- rxLinMod(dist~speed, cars)\nrxPredict(model, cars)") : 
    remote evaluation failed 

和Rserve产生以下错误输出:

> Error in doTryCatch(return(expr), name, parentenv, handler) : 
    ignoring SIGPIPE signal 
Error in doTryCatch(return(expr), name, parentenv, handler) : 
    Write error: expected 8 got 

奇怪的是,RevoS如果我将Rserve置于调试模式,caleR似乎会间歇性地工作。如果我在Windows上的Microsoft R Server上运行Rserve,它也可以工作,但Windows上的Rserve受到很大限制。

我的怀疑之一是Rserve的分叉可能会导致问题,但唯一与叉簧有关的警告我可以找到有关RevoScaleR的约thread pool feature,我没有启用。我觉得与BxlServer的连接可能也是一个问题--Rserve似乎并没有在fork上创建一个新的BxlServer--但我找不到任何相关文档,我甚至不知道BxlServer是否涉及到if你没有连接到SQL Server。 GDB显示SIGPIPE正在发生在SendAndReceiveBxlFnToServer中,这听起来像是BxlServer所涉及的。

我在SLES 11 SP3和Microsoft R Client 3.3.3上。

Rserve与RevoScaleR不兼容?如果它兼容,我需要执行任何额外的设置,而不是使用常规R来使其工作?

+0

进一步的调查显示,在调试模式下,Rserve在初始启动时启动一个新的BxlServer(但没有新的分叉)。在常规模式下,Rserve从不启动BxlServer。这里有一些重要的事情正在与BxlServer进行。 – user2357112

+0

更多调查显示,Rserve确实启动了BxlServer,但随后它在Rserve守护进程的时间内发生SIGHUP并死亡。在调试模式下Rserve不会守护进程,这可能是调试模式不同的原因。我认为BxlServer在Rserve的分叉方面表现不佳,考虑到最近关于分叉和线程池的文章是多么的新颖,这有点奇怪。 – user2357112

+0

你想用Rserve做什么?请注意,MRS附带可操作性工具。 –

它戳在实施细节,但RevoScaleR:::startBxlServer()手动启动BxlServer似乎解决的事情:

RSeval(rsc, 'RevoScaleR:::startBxlServer()') 

Rserve的分流机制似乎与BxlServer不良相互作用 - 至少,香草Rserve。我不确定DeployR分支是干什么的。