5.1 R语言服务器程序 Rserve详解
问题
Rserve怎么用?
引言
在4.1节中,我们初识了Rserve,用于R和Java的通信,但上次说得不够细,用起来处处有坑。接下来,深入细节再学学。
Rserve作为一个R语言与其他语言的通信(TCP/IP)接口,被多个项目所依赖。Rserve服务端配置和运行都非常简单,客户端由多种语言实现,如C/C++, Java等。R也有自己的客户端实现RSclient 项目,将在下一节介绍。本节详细剖析Rserve作为服务器端应用的配置和使用。
5.1.1 Rserve的启动
本节使用的系统环境是:
- Linux: Ubuntu 12.04.2 LTS 64bit
- R: 3.0.1 x86_64-pc-linux-gnu
注:Rserve同时支持Win7环境和Linux环境,由于Rserve主要用来做通信服务器,建议使用Linux环境。
Rserve安装
~ R # 启动R程序
> install.packages("Rserve") # 安装Rserve
> library(Rserve) # 加载Rserve
启动Rserve服务器,有两种方式 在R运行环境中启动Rserve服务器和在命令行中启动Rserve服务器。在R的运行环境中启动Rserve服务器时,我们可以用到Rserve的函数。
- Rserve(): 单独启动一个守护进程作为Rserve实例。
- run.Rserve(): 在当前的进程中,启动Rserve实例
- self函数:主是用于与当前进程中的Rserve服务器程序交互,包括4个函数
• self.ctrlEval(),self.ctrlSource(),self.oobSend(),self.oobMessage(),这几函数很少会被用到。
1. 在程序中,启动Rserve服务器
> library(Rserve)
> Rserve() # 单独启动一个守护进程作为Rserve实例。
Starting Rserve:
/usr/lib/R/bin/R CMD /home/conan/R/x86_64-pc-linux-gnu-library/3.0/Rserve/libs//Rserve
查看Rserv进程。
~ ps aux | grep R
conan 8799 0.1 1.5 121748 32088 pts/0 S+ 22:30 0:00 /usr/lib/R/bin/exec/R
conan 8830 0.0 1.2 116336 25044 ? Ss 06:46 0:00 /home/conan/R/x86_64-pc-linux-gnu-library/3.0/Rserve/libs//Rserve
~ netstat -nltp|grep Rserve
tcp 0 0 127.0.0.1:6311 0.0.0.0:* LISTEN 8830/Rserve
这种情况,当前的R运行环境并没有被中断,而在系统后台单独启动了一个Rserve实例。用run.Rserve()函数启动,则是在当前的R运行环境启动Rserve。
> run.Rserve() # 在当前的进程中,启动Rserve实例
-- running Rserve in this R session (pid=30664), 1 server(s) --
(This session will block until Rserve is shut down)
~ ps aux|grep R # 查看R的进程
30664 pts/0 00:00:00 R
~ netstat -nltp|grep R
tcp 0 0 127.0.0.1:6311 0.0.0.0:* LISTEN 30664/R
2. 在命令行,启动Rserve服务器
首先查看Rserve命令行帮助。
~ R CMD Rserve --help
Usage: R CMD Rserve []
Options: --help this help screen
--version prints Rserve version (also passed to R)
--RS-port listen on the specified TCP port
--RS-socket use specified local (unix) socket instead of TCP/IP.
--RS-workdir use specified working directory root for connections.
--RS-encoding set default server string encoding to .
--RS-conf load additional config file.
--RS-settings dumps current settings of the Rserve
--RS-source source the specified file on startup.
--RS-enable-control enable control commands
--RS-enable-remote enable remote connections
All other options are passed to the R engine.
在命令行启动Rserve,并打开远程访问模式。
~ R CMD Rserve --RS-enable-remote
查看Rserv的进程。
~ ps -aux|grep Rserve
conan 27639 0.0 1.2 116288 25236 ? Ss 20:41 0:00 /usr/lib/R/bin/Rserve --RS-enable-remote
~ netstat -nltp|grep Rserve
tcp 0 0 0.0.0.0:6311 0.0.0.0:* LISTEN 27639/Rserve
5.1.2 Rserve高级使用:Rserve配置管理
我们可以通过配置文件Rserv.conf,管理Rserve服务器,在配置文件中可以定义服务器的启动脚本。通过命令查看Rserve服务器默认的配置信息。
~ R CMD Rserve --RS-settings
Rserve v1.7-1
config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: no
plain text password: not allowed
passwords file: [none]
allow I/O: yes
allow remote access: no
control commands: no
interactive: yes
max.input buffer size: 262144 kB
当前Rserve服务器配置说明:
- config file: 如果本地无此文件/etc/Rserv.conf, 系统会默认跳过这项。
- working root: R运行时工作目录 /tmp/Rserv。
- port: 通信端口6311。
- local socket: TCP/IP协议。
- authorization: 认证未开启。
- plain text password: 不允许明文密码。
- passwords file: 密码文件,未指定。
- allow I/O: 允许IO操作。
- allow remote access: 远程访问未开启。
- control commands: 命令控制未开启。
- interactive: 允许交互。
- max.input buffer size: 文件上传限制262MB。
修改默认配置,增加远程访问,并设置加载脚本。新建文件 /etc/Rserv.conf。
~ sudo vi /etc/Rserv.conf
workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source /home/conan/R/RServe/source.R
eval xx=1
source选项用来配置Rserve服务器启动时加载的文件,例如,初始化系统变量,初始化系统函数等。eval选项用来定义环境变量。
增加Rserve服务器初始化的启动脚本。
~ vi /home/conan/R/RServe/source.R
cat("This is my Rserve!!")
print(paste("Server start at",Sys.time()))
再次查看服务器配置
~ R CMD Rserve --RS-settings
Rserve v1.7-1
config file: /etc/Rserv.conf
working root: /tmp/Rserv
port: 6311
local socket: [none, TCP/IP used]
authorization required: yes
plain text password: allowed
passwords file: [none]
allow I/O: yes
allow remote access: yes
control commands: yes
interactive: yes
max.input buffer size: 262144 kB
重新启动Rserve服务器
~ R CMD Rserve
R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
This is my Rserve!![1] "Server start at 2013-10-30 22:38:10"
Rserv started in daemon mode.
查看日志:source.R在启动时候被执行。
"This is my Rserve!![1] "Server start at 2013-10-30 22:38:10""
查看进程
~ ps -aux|grep Rserve
conan 28339 0.0 1.2 116292 25240 ? Ss 22:31 0:00 /usr/lib/R/bin/Rserve
~ netstat -ntlp|grep Rserve
tcp 0 0 0.0.0.0:6311 0.0.0.0:* LISTEN 28339/Rserve
0 0.0.0 表示允许远程访问, 不限制IP
5.1.3 Rserve高级使用:用户登陆认证
在本地环境,无认证情况下,使用RSclient访问Rserve。关于RSclient的使用,请参考5.2节。
~ R
> library(RSclient)
> conn<-RS.connect()
> RS.eval(conn,rnorm(10))
[1] 0.03230305 0.95710725 -0.33416069 -0.37440009 -1.95515719 -0.22895924
[7] 0.39591984 1.67898842 -0.01666688 -0.26877775
修改配置,增加用户登陆认证,并允许明文密码,修改文件:/etc/Rserv.conf
~ sudo vi /etc/Rserv.conf
workdir /tmp/Rserv
remote enable
fileio enable
interactive yes
port 6311
maxinbuf 262144
encoding utf8
control enable
source /home/conan/R/RServe/source.R
eval xx=1
auth required
plaintext enable
使用RSclient直接访问时,认证报错。
> library(RSclient)
> conn<-RS.connect()
> RS.eval(conn,rnorm(10))
Error in RS.eval(conn, rnorm(10)) :
command failed with status code 0x41: authentication failed
用RSclient登陆
> library(RSclient)
> conn<-RS.connect()
> RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
[1] TRUE
> RS.eval(conn,rnorm(5))
[1] -1.19827684 0.72164617 0.22225934 0.09901505 -1.54661436
这里用户登陆认证,是绑定的操作系统用户。我们还可以在Rserv.conf配置文件中指定uid,gid参数,从而更细粒度地控制服务器权限。
本节详细地介绍了Rserve的安装、启动、配置、使用等的功能。有了这些知识积累,我们就可以利用Rserve来构建企业级的上线应用了。