创业公司使用R语言搭建简单的数据分析系统

ihkm4462 8年前

来自: 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传参。