创业公司使用R语言搭建简单的数据分析系统
来自: http://blog.csdn.net/a345017062/article/details/50668353
概述
整个系统分为三个服务
一、数据源。这个可以是各种形式的数据库。当然,你如果有高大上的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传参。