概述
整个系统分为三个服务
一、数据源。这个可以是各种形式的数据库。当然,你如果有高大上的Hadoop也是可以的。
二、分析引擎。就是R了,这里我们使用Rserve搭建一个服务。
三、分析脚本容器。根据每一个数据分析需求我们都会写成一个R脚本,放到容器中,由容器来做参数分发,脚本调用,结果输出。
数据源
这个就不需要细说了,把公司自己的数据源接过来,向分析引擎开放Read权限就行了。可以是MySQL,也可以是Hadoop,或者其它数据平台。
分析引擎
安装R环境,Rserve库。http://www.rforge.net/Rserve/
启动Rserve。
1、R //命令行启动R
2、library(“RServe”) //加载Rserve库
3、Rserve() //启动Rserve服务
Rserve服务的作用就是接受服务调用方的请求,执行R命令,或加载并执行R脚本,调用本地的R Runtime进行运算,返回执行结果。
输入的形式可以是R脚本文件路径或R命令集合,输出的形式可以有向量、Matrix、data frame、List、PDF、jpg、png、CSV等所有R语言支持的输出类型。
我的数据源是MySQL,所以安装了RMySQL这个library。然后使用以下代码连接数据MySQL
library(RMySQL)//加载RMySQL库
conn <- dbConnect(MySQL(), dbname = "xxx", username="xxx", password="xxx",host="xxx")//连接远程数据库
myData <- dbGetQuery(conn,"select * from persons limit 10")//执行查询操作
dbDisconnect(conn)//关闭远程数据库连接
容器
由于R是个脚本语言,所以给容器带来了先天的冷启动特性。容器要做的主要有三件事:
1、输入参数分析。把服务Client端的参数解析成R可以识别的参数,当然,还有容错处理。
2、脚本调用。根据服务Client端的命令映射到具体的R脚本上,并调用分析引擎服务加载执行R脚本。
我这里做了一个Tomcat下的app。
RConnection rConnection = new RConnection("127.0.0.1");
rConnection.eval("source('xxx.R')");
rConnection.close();//通信完成之后,关闭连接
3、结果输出。根据服务Client端的要求,把结果以Json(向量、矩阵、data frame、List)、二进制文件(PDF、jpg、png、CSV)等类型向Client端输出结果。
REXP rexp = rConnection.parseAndEval("GLOBAL_main()");
String outputType = xxx;
if (output.equals("csv")){
byte[] csvData = getBytesFromREXP(rexp,response);
if (csvData != null){
response.setContentType("text/csv");
response.setHeader("Content-Disposition","attachment;filename="+target+"_output.csv");
// 响应输出流
ServletOutputStream out = response.getOutputStream();
out.write(csvData);
out.flush();
out.close();
}else if (output.equals("jpg")){
byte[] jpgData = getBytesFromREXP(rexp,response);
if (jpgData != null){
response.setContentType("image/jpg");
// 响应输出流
ServletOutputStream out = response.getOutputStream();
out.write(jpgData);
out.flush();
out.close();
}else if (output.equals("png")){
byte[] pngData = getBytesFromREXP(rexp,response);
if (pngData != null){
response.setContentType("image/png");
// 响应输出流
ServletOutputStream out = response.getOutputStream();
out.write(pngData);
out.flush();
out.close();
}else {
//其它输出类型,可以使用Json、XML等规范
}
具体到脚本容器app与分析引擎Rserve的交互,使用RServe源码的inst目录下面的REngine.jar和RserveEngine.jar两个文件就可以了。里面包含各种形式的Demo。
容器对外提供服务的形式,可以遵循RESTful,也可以直接使用GET query传参。