創業公司使用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傳參。