Rserve的R语言客户端RSclient

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-rserve-rsclient/

rsclient-rserve

前言

RSclient是实现Rserve通信的R语言客户端程序,对于统计人员使用RSclient调用Rserve运行R语言脚本,感觉会很奇怪。但对于实际应用架构来说却是很有帮助的,不仅可以统一Rserve的接口,还可以从架构上实现R语言的跨虚拟机的分步式程序设计。

目录

  1. Rserve和RSclient介绍
  2. Rserve系统环境
  3. RSclient安装
  4. RSclient的API
  5. RSclient使用
  6. 两个客户端同时访问

1. Rserve和RSclient介绍

Rserve介绍

Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。

Rserve的使用请参考文章:R语言服务器程序 Rserve详解, Rserve与Java的跨平台通信

RSclient介绍

RSclient是Rserve客户端的R语言实现,通过RSclient可以访问Rserve服务器实例。

官方介绍:http://www.rforge.net/RSclient/

2. Rserve系统环境

服务器系统环境

  • Linux: Ubuntu 12.04.2 LTS 64bit
  • R: 3.0.1 x86_64-pc-linux-gnu
  • Rserve: Rserve v1.7-1

启动Rserve服务器


~ R CMD Rserve

~ 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

Rserve环境

  • IP: 192.168.1.201,允许远程访问
  • 端口: 6311
  • 登陆认证: 用户名:conan, 密码:conan
  • 字符编码: utf-8

~ 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

3. RSclient安装

客户端环境,远程访问

  • Win7 64bit
  • R: 3.0.1 x86_64-w64-mingw32/x64 b4bit

RSclient安装和加载


~ R

> install.packages("RSclient")
> library(RSclient)

4. RSclient的API

RSclient的API分为两组,Rclient(旧版本)和RCC(新版本)。

Rclient 旧版本API:函数名是大小写连写的

RSassign           RSattach           RSclose
RSconnect          RSdetach           RSeval             RSevalDetach
RShowDoc           RSiteSearch        RSlogin            RSserverEval
RSserverSource     RSshutdown         RSclient::

RCC 新版本API:函数名以.分隔的

RS.assign          RS.authkey         RS.close           RS.collect
RS.connect         RS.eval            RS.eval.qap        RS.login
RS.oobCallbacks    RS.server.eval     RS.server.shutdown RS.server.source
RS.switch

我主要介绍新版本API的使用

客户端操作函数

  • RS.connect: 创建与Rserve的连接
  • RS.close: 关闭与Rserve的连接
  • RS.login: 登陆认证
  • RS.authkey: 设置认证时加密算法
  • RS.eval: 在Rserve远程执行R语句
  • RS.eval.qap: 远程执行R语句,使用Rserve QAP序列化对象代替本地对象
  • RS.collect: 等待异步执行的eval的结果,一起返回
  • RS.assign: 远程执行赋值
  • RS.switch: 协议转换,从QAP1到TLS QAP1
  • RS.oobCallbacks: 回调函数, 通过OOB_SEND函数和OOB_MSG函数中执行

服务器管理函数:Rserve启动时,需要设置–RS-enable-control

  • RS.server.eval: 服务器控制函数,执行脚步
  • RS.server.shutdown: 服务器控制函数,关闭服务器
  • RS.server.source: 服务器控制函数,执行服务器端本地文件

5. RSclient的使用


~ R
> library(RSclient)

#建立连接
> conn<-RS.connect(host="192.168.1.201")
> conn
 Rserve QAP1 connection 0x000000000445cd60 (socket 308, queue length 0)

#登陆认证
> RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
[1] TRUE

#执行脚本
> RS.eval(conn,rnorm(5))
[1] -2.6762608  1.4435144 -0.4298395 -0.7046573 -1.4056073

#设置变量
> RS.assign(conn,"xx",99)
raw(0)
> RS.eval(conn,xx-55)
[1] 44

#同步执行
> RS.eval(conn,head(rnorm(10000000)),wait=TRUE)
[1] -4.20217390  0.22353317 -1.70256992  0.30053213 -0.01427486 -0.70522254

#异步执行
> RS.eval(conn,head(rnorm(10000000)),wait=FALSE)
NULL
> RS.collect(conn)
[1] -0.2814752  0.3215521 -1.0978825 -0.8534461 -0.2459560 -0.4804882

#关闭连接
> RS.close(conn)
NULL
> conn
 Closed Rserve connection 0x000000000445cc80

6. 两个客户端同时访问

客户端A


~ R 
library(RSclient)
conn<-RS.connect(host="192.168.1.201")
RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
RS.assign(conn,"A",1234)

> RS.eval(conn,A)
[1] 1234

> RS.eval(conn,getwd())
[1] "/tmp/Rserv/conn29039"

客户端B


~ R 
library(RSclient)
conn<-RS.connect(host="192.168.1.201")
RS.login(conn,"conan","conan",authkey=RS.authkey(conn))
RS.assign(conn,"B",5678)

> RS.eval(conn,B)
[1] 5678
> RS.eval(conn,ls())
[1] "B"
> RS.eval(conn,getwd())
[1] "/tmp/Rserv/conn29040"

我们看到A,B两个客户端建立接口后,服务器端的Rserve会在两个单独的空间运行。因此,A,B两个客户端的访问是独立的。

在客户端A,设置服务器全局变量


> RS.server.eval(conn, "G<-999") :
  command failed with status code 0x48: access denied

注:出现拒绝访问的错误,虽然我们已经打开了--RS-enable-control,还是有错误,不知道是不是Rserve的bug。

通过RSclient,我们就可以远程连接Rserve。如果大家发散一下想法,就可以通过Rserve和RSclient构建一个纯R的分步式计算环境。下篇文章我将模拟构建一个这样的环境!!

转载请注明出处:
http://blog.fens.me/r-rserve-rsclient/

打赏作者

This entry was posted in R语言实践

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

15 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

[…] Java等。R也有自己的客户端实现 RSclient […]

ypchen

那么上面你提到的疑似bug的东西,是真bug吗,对后面有没有影响?报告给这个包的开发者了吗?

Conan Zhang

1. 我不确定是不是bug,在不需要认证的情况下,这个函数是正常的。
2. 我没有测试,TLS安全连接的情况
3. 我没有测试,密文认证的情况
4. 他的官方文档,也没有详细列出来对上面3种情况的支持。
5. 没有报告给官方。

Weilin Lin

赞!学习了

Conan Zhang

RSclient + Rserve就可以模拟分布式计算了,明天我写个例子出来!

qingshi

有通过java调用R程序的例子吗

zk

安装的时候会出现错误: cli.c:48:25: 致命错误: openssl/rsa.h:没有那个文件或目录

zk

原因是没有安装 libssl-dev,apt-get install libssl-dev后问题解决。

ypchen

Rserve只能在linux环境下使用吗?

Conan Zhang

可以在window中用,RStuido就是基于Rserve做的。

cnzhouqp

RS.login(conn,”conan”,”conan”,authkey=RS.authkey(conn)) 这里CONAN在哪儿配置?

Conan Zhang
shuangchanglu

测试mapreduce程序时,报错:Caused by:java.io.IOException:Cannot run program “Rscript” :err=2,没有那个文件或目录。

Conan Zhang

是本文的问题吗?

15
0
Would love your thoughts, please comment.x
()
x