剛完成SparkR的支持腹鹉,順手記錄下流程…
1 編譯SparkR
1.1 生成SparkR的lib包
# where /home/username/R is where R is installed and /home/username/R/bin contains the files R and RScript
export R_HOME=/home/username/R
cd $SPARK_HOME/R
./install-dev.sh
1.2 編譯Spark
./dev/make-distribution.sh --tgz -Psparkr \
-Pyarn -Phadoop-2.7 \
-Dhadoop.version=2.7.2-307 -Phive \
-Phive-thriftserver -Pnetlib-lgpl \
-Pspark-ganglia-lgpl -DskipTests \
-Denforcer.skip=true
1.3 local模式運(yùn)行SparkR
./bin/sparkR --master local[2]
測試用例參見官方文檔:R on Spark
2 Yarn模式運(yùn)行SparkR
依據(jù)SparkR的執(zhí)行原理, 其需要在每個Executor(JVM)中啟動一個R進(jìn)程,因此,若集群節(jié)點(diǎn)未安裝R環(huán)境的需要通過參數(shù)指定的方式自定義R環(huán)境墓赴。其過程如下:
2.1 創(chuàng)建R的可執(zhí)行程序包
我們的Linux環(huán)境為Centos航瞭, R官方僅提供了yum安裝方式刊侯,未提供Binary的完整程序包,因此需要自己制作滨彻,此處我們選擇使用Conda進(jìn)行制作(Conda 是一個開源的軟件包管理系統(tǒng)和環(huán)境管理系統(tǒng)亭饵,用于安裝多個版本的軟件包及其依賴關(guān)系,并在它們之間輕松切換)踏兜。
2.1.1 Conda 安裝
Anaconda 官方網(wǎng)站下載適合節(jié)點(diǎn)環(huán)境版本的Conda八秃,下載文件為.sh后綴的腳本文件。
//安裝
bash Anaconda2-5.0.1-Linux-x86_64.sh
//默認(rèn)安裝位置為用戶根目錄下
由于官網(wǎng)的鏡像在境外,訪問速度太慢疹尾,為了能夠加快訪問的速度,需要設(shè)置清華鏡像清華大學(xué)開源軟件鏡像站-anaconda骤肛。
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --set show_channel_urls yes
2.1.2 使用Conda創(chuàng)建R Essentials
安裝R Essentials至當(dāng)前環(huán)境
conda install -c r r-essentials
創(chuàng)建R環(huán)境
conda create -p /home/chenchengchen/r_env --copy -y -q r-essentials -c r
命令執(zhí)行完成時將在"/home/chenchengchen/r_env"目錄生成執(zhí)行R必要的binary及l(fā)ib.
值得注意的是:Conda生成的R腳本中使用了目錄的絕對路徑纳本,需要對其進(jìn)行修改,否則腋颠,在Yarn container中將發(fā)生找不到文件的錯誤繁成。
cd /home/chenchengchen/r_env/bin/
# 將R文件中的"/home/chenchengchen"替換為".",替換的路徑?jīng)Q定下面的打包路徑及spark環(huán)境配制秕豫,此處一定注意朴艰;
# 本例采用sed進(jìn)行替換(vim命令也可)观蓄,# sed -i 's/原字符串/新字符串/' filepath; 因其語法原因,若路徑中存在"/"需要使用"\"轉(zhuǎn)義
sed -i "s/\/home\/chenchengchen/./g" R
將Conda提取的R環(huán)境打包成zip祠墅,即可交由Spark使用.
# 進(jìn)入r_env目錄
cd /home/chenchengchen/r_env
# 依據(jù)上述sed的重命名的路徑侮穿,將r_env中文件打包到zip的根目錄(解壓開沒有目錄結(jié)構(gòu)毁嗦,直接為r_env中的眾文件)
zip -r -p r_env.zip *
2.2 Yarn模式提交SparkR(shell 腳本亲茅,spark-submit類似)
sparkR --master yarn \
--deploy-mode client \
--queue your.queue.name \
--archives ~/r_env.zip#r_env \ #
--conf spark.executorEnv.RHOME=./r_env \ ## R環(huán)境配制與打包路徑有關(guān)
--conf spark.r.command=./r_env/bin/Rscript \
提交成功后,執(zhí)行如下代碼進(jìn)行測試:
df <- as.DataFrame(faithful)
# Displays the first part of the SparkDataFrame
head(df)
## eruptions waiting
##1 3.600 79
##2 1.800 54
##3 3.333 74
測試用例參見官方文檔:R on Spark
2.2.1 Yarn Cluster模式
上述舉例為Yarn Client模式狗准,若要使用Yarn Cluster模式克锣,還需指定"spark.yarn.appMasterEnv.RHOME=./r_env";
3 第三方 R依賴包安裝
在SparkR控制臺,以命令行方式安裝第三方R依賴包腔长,安裝方式有如下兩種:
(1)網(wǎng)絡(luò)安裝(以mvtnorm為例)
install.packages(“mvtnorm”, repos=“http://cran.us.r-project.org”)
(2)本地安裝
# 首先下載mvtnorm.tar.gz至本地
path <- /home/chenchengchen/mvtnorm.tar.gz
#安裝依賴包
install.packages(path, repos=NULL, type="source")
執(zhí)行安裝命令后袭祟,第三方依賴包會被安裝至$SPARK_HOME/R/lib目錄下。
## 目錄結(jié)構(gòu)
mvtnorm SparkR sparkr.zip
雖然已安裝至lib目錄下捞附,但真正上傳集群的sparkr.zip中并無mvtnorm庫巾乳,需要刪除sparkr.zip重新打包
# 刪除原sparkr.zip
rm sparkr.zip
# 重新打包sparkr.zip文件
# 要在R/lib目錄下操作,否則會現(xiàn)打不到文件異常
zip -r sparkr.zip *
重新啟動sparkR 即可正常運(yùn)行
3.1 測試 demo
df <- createDataFrame(list(list(1L, 1, "1"), list(2L, 2, "2"), list(3L, 3, "3")), c("a", "b", "c"))
showDF(df)
+---+---+---+
| a| b| c|
+---+---+---+
| 1|1.0| 1|
| 2|2.0| 2|
| 3|3.0| 3|
+---+---+---+
schema <- structType(structField("a", "integer"), structField("b", "double"), structField("c", "string"), structField("d", "double"))
df1 <- dapply(df, function(x) {
library(mvtnorm)
x <- cbind(x, x$a * rmvnorm(n=1, mean=c(1))) }, schema)
showDF(df1)
+---+---+---+------------------+
| a| b| c| d|
+---+---+---+------------------+
| 1|1.0| 1|0.8024247855452726|
| 2|2.0| 2|1.6048495710905453|
| 3|3.0| 3| 2.407274356635818|
+---+---+---+------------------+