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来构建企业级的上线应用了。

results matching ""

    No results matching ""