【筆記】java調用R,R調用hadoop

筆記

1.安裝R(linux cmd) 
R CMD INSTALL "R.3.5.1.tar.gz"
2.安裝Rserve(linux cmd)--開啓遠程調用服務
R CMD INSTALL "Rserve_1.8-6.tar.gz"
3.安裝rhdfs(linux cmd)--R調用hdfs文件的包
R CMD INSTALL "rhdfs_1.0.8.tar.gz"
4.安裝car包的時候nloptr_1.0.4.tar.gz的問題:
方案:https://cloud.tencent.com/developer/ask/28435/answer/34813
將nlopt-2.4.2.tar.gz放到/home/ruser/nlopt-2.4.2.tar.gz
然後安裝nloptr_1.0.4.tar.gz

 

設置環境變量sudo vi /etc/profile
export HADOOP_HOME=/usr/iop/4.1.0.0/hadoop
export HADOOP_CONF_DIR=/usr/iop/4.1.0.0/hadoop/conf
export HADOOP_CMD=/usr/bin/hadoop
export JAVA_LIBRARY_PATH=/usr/iop/4.1.0.0/hadoop/lib/native

4.開啓Rserve遠程調用(linux cmd)
/usr/lib64/R/bin/R CMD /home/ruser/R/x86_64-redhat-linux-gnu-library/3.3/Rserve/libs//Rserve --RS-enable-remote

/usr/lib64/R/bin/R CMD /home/ruser/R/x86_64-redhat-linux-gnu-library/3.2/Rserve/libs/Rserve --RS-enable-remote

5.R讀取hadoop文件

library('rhdfs')
hdfs.init()
qtread.hdfs <- function(hdfs.path, hadoop.cmd = "hadoop") {
  tmp.file <- sprintf("tmp_hadoop_%s.csv", as.numeric(Sys.time()))
  cmd <- sprintf("%s fs -cat %s | perl -pe 's/\t/,/g' > %s", hadoop.cmd, hdfs.path, tmp.file)
  cat("excute hadoop cmd:",cmd,"\n")
  system(command = cmd)
  df <- read.csv(tmp.file, header = T, stringsAsFactors = F)
  file.remove(tmp.file)
  df
}


drawEllipse <- function(x,y,group,path){
    data <- qtread.hdfs(path)
    return (data)
}

6.java調用R代碼

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.REngineException;
import org.rosuda.REngine.RFactor;
import org.rosuda.REngine.RList;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

String rServerIp = "10.38.149.122";
RConnection connection = null;
connection = new RConnection(rServerIp);//獲取r連接,如果沒有R的第四步,此處報錯

String rWd = "/home/ruser/Rjobs/Rscript/idat";
String ellipseCalcFile = "generateEllipse.R";

connection.eval("setwd('"+rWd+"')");//設置R的工作目錄
String rfile = "source('"+ellipseCalcFile+"')";
connection.eval(rfile);//運行工作目錄的R腳本

String path = "/files/idat/P051_Z0_BLN_3KERS_P12.csv";
String x1 = "x1";
String y1 = "y1";
String group1 = "group1";
String funt = "drawEllipse('"+x1+"','"+y1+"','"+group1+"','"+path+"')";
REXP rexp = connection.eval(funt);//調用R腳本的function,並返回REXP值
RList list = rexp.asList();
String[] key = list.keys();

 

哭喊吧,哀求吧,掙扎吧,然後……死吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章