我正在尝试在 Microsoft R 客户端上运行 Rserve 并通过网络连接执行 RevoScaleR 功能。我可以运行非 RevoScaleR 函数,但 RevoScaleR 似乎存在某种兼容性问题。
我可以启动一个 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
奇怪的是,如果我将 Rserve 置于调试模式,RevoScaleR 似乎会间歇性地工作。如果我在 Windows 上的 Microsoft R Server 上运行 Rserve,它也可以工作,但 Windows 上的 Rserve 受到很大限制。
我的一个怀疑是 Rserve 的分叉可能会导致问题,但我能找到的关于 RevoScaleR 的唯一与分叉相关的警告是关于我没有启用的线程池功能。我觉得与BxlServer的连接也可能是一个问题——Rserve 似乎没有在 fork 上创建一个新的 BxlServer——但我找不到任何关于它的文档,我什至不知道 BxlServer 是否参与其中您没有连接到 SQL Server。GDB 显示 SIGPIPE 发生在 SendAndReceiveBxlFnToServer 中,这听起来像是涉及 BxlServer。
我使用的是 SLES 11 SP3 和 Microsoft R Client 3.3.3。
Rserve 是否与 RevoScaleR 不兼容?如果它兼容,我是否需要对常规 R 进行任何额外的设置才能使其正常工作?