Rserve的R語言客戶端RSclient

R語言做爲統計學一門語言,一直在小衆領域閃耀着光芒。直到大數據的爆發,R語言變成了一門煊赫一時的數據分析的利器。隨着愈來愈多的工程背景的人的加入,R語言的社區在迅速擴大成長。如今已不單單是統計領域,教育,銀行,電商,互聯網….都在使用R語言。 java

要成爲有理想的極客,咱們不能停留在語法上,要掌握牢固的數學,機率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓咱們一塊兒動起來吧,開始R的極客理想。 linux

關於做者: 程序員

轉載請註明出處:
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介紹 socket

Rserve是一個基於TCP/IP協議的,容許R語言與其餘語言通訊的C/S結構的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供遠程鏈接,認證,文件傳輸等功能。咱們能夠設計R作爲後臺服務,處理統計建模,數據分析,繪圖等的任務。 tcp

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/

相關文章
相關標籤/搜索