[原]海納百川 有容乃大:SparkR與Docker的機器學習實戰
作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息並註明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog/harryprinc...,如果涉及源代碼請註明GitHub地址:harryprince (HarryZhu) · GitHub。微信號: harryzhustudio
商業使用請聯繫作者。
介紹
大數據時代,我們常常面對海量數據而頭疼。作為學統計出身的人,我們想折騰大數據但又不想學習Hadoop或者Java,我們更傾向於把精力放在建模和演算法設計上,SparkR和Docker的完美結合,讓R的計算直接從一架戰鬥機的當兵作戰華麗轉變為一個航空母艦戰鬥群!不僅僅簡化了分散式計算的操作,還簡化了安裝部署的環節,我們只幾乎不需要做什麼改動就可以直接運用R中的data frame進行分散式的計算。
什麼是SparkR
參考前文 打造大數據產品:Shiny的Spark之旅,我們可以知道,SparkR是一個為R提供了輕量級的Spark前端的R包。 SparkR提供了一個分散式的data frame數據結構,解決了 R中的data frame只能在單機中使用的瓶頸,它和R中的data frame 一樣支持許多操作,比如select,filter,aggregate等等。(類似dplyr包中的功能)這很好的解決了R的大數據級瓶頸問題。 SparkR也支持分散式的機器學習演算法,比如使用MLib機器學習庫。
什麼是Docker
參考前文 打造數據產品的快速原型:Shiny的Docker之旅,我們也可以知道,Docker是一種類似於虛擬機的技術,主要解決標準化快速部署的問題,在Docker中安裝的軟體和主機中的軟體可以完全隔離,並通過Daocloud或者hub.docker.com等雲服務快速建立Docker倉庫,快速復用Docker鏡像。Docker已經不僅僅是DevOps人員手中的神器了,每一個開發者都應該學會如何使用Docker。
為什麼要結合SparkR和Docker
SparkR的精髓在於分散式計算,而Docker的精髓在於標準容器的拓展性,SparkR和Docker的組合充分結合了二者各自的優點,將分散式應用底層化繁為簡,為高層計算直接暴露介面,給科學計算節省了大量時間。
部署
本文將通過Docker講解如何快速部署SparkR-RStudio容器,並通過一些簡單的機器學習例子展示如何使用這個航母級別的組合拳。
步驟一:安裝Docker和Daocloud
由於國內的鏡像質量不夠高,國外的鏡像下載速度比較慢,出於試驗的考慮,建議大家可以嘗試使用Daocloud的鏡像加速服務。
首先,我們需要在Daocloud註冊一個賬號,然後選擇鏡像加速,根據指示選擇主機並安裝Docker和Daocloud加速器。
步驟二:安裝Spark-RStudio
感謝 vinicius85 在GitHub上的開源貢獻,為我們已經做好了 Spark1.6+R+RStduio的鏡像,我們利用daocloud加速拉取鏡像。
dao pull vinicius85/spark-rstudio
以daemon形式運行容器,暴露Rstudio-server默認的8787埠, 並持久化docker內的/srv目錄下的所有文件作為通訊。
docker run -d -v /home/docker:/srv -p 8787:8787 --name sparkrstudio vinicius85/sparkr-rstudio
步驟三:配置RStudio登陸賬號
參考前文 R語言工程化實踐:RStudio Server環境快速配置教程
docker exec -d sparkrstudio bash命令表示以daemon形式執行容器中的shell腳本
我們設置一下RStudio-Server的賬號密碼
docker exec -d sparkrstudio bash adduser harryzhu # 設置新用戶名docker exec -d sparkrstudio bash passwd harryzhu # 設置該用戶的密碼
步驟四:登陸RStudio
ifconfig命令可以查看到Docker當前的IP地址,透過這個IP,我們可以訪問到RStudio-Server。
比如:
查看資源佔用情況
docker stats sparkrstudio
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/Osparkrstudio 4.50% 481.3 MB / 5.039 GB 9.55% 133.6 kB / 117.4 kB 3.252 MB / 135.2 kB
機器學習示例:
出於演示的考慮,這裡引用並稍微改進了 tcosta 完成的一個邏輯回歸的例子:
初始化
使用SparkR之前,我們需要確定,我們的容器內存要在2G以上,如果用AWS的乞丐版套裝,馬上就會報內存不足的錯誤。
Error in sparkR.init(master = "local") : JVM is not ready after 10 seconds
如果內存不足,可以退出docker並且在虛擬機中重新提高docker的內存和cpu的配置。
# 配置環境變數Sys.setenv(SPARK_HOME="/opt/spark-1.6.0-bin-hadoop2.6") .libPaths(c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"), .libPaths())) Sys.setenv(JAVA_HOME="/usr/lib/jvm/java-8-oracle/")# 載入 SparkR包library(SparkR) # 初始化RRDsc <- sparkR.init(master = "local")sqlContext <- sparkRSQL.init(sc)# 創建DataFramemtcarsDF <- createDataFrame(sqlContext, mtcars)head(mtcarsDF)
mpg cyl disp hp drat wt qsec vs am gear carb1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 42 21.0 6 160 110 3.90 2.875 17.02 0 1 4 43 22.8 4 108 93 3.85 2.320 18.61 1 1 4 14 21.4 6 258 110 3.08 3.215 19.44 1 0 3 15 18.7 8 360 175 3.15 3.440 17.02 0 0 3 26 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
邏輯回歸
model <- glm(vs ~ mpg + disp + hp + wt , data = mtcarsDF, family = "binomial")# 邏輯回歸# model <- glm(vs ~ mpg + disp + hp + wt , data = mtcarsDF, family = "gaussian")# 線性回歸predictions <- predict(model, newData = mtcarsDF )modelPrediction <- select(predictions, "vs", "prediction")head(modelPrediction)
vs prediction1 0 0.580069452 0 0.640607093 1 0.724687184 1 0.478038425 0 0.060709726 1 0.54994276
模型評估
# error變數: 觀測值和預測值的差值modelPrediction$error <- abs(modelPrediction$vs - modelPrediction$prediction) # modelPrediction 現在對 SQLContext 是可見的registerTempTable(modelPrediction, "modelPrediction") num_errors <- sql(sqlContext, "SELECT count(error) FROM modelPrediction WHERE error = 1")total_errors <- sql(sqlContext, "SELECT count(error) FROM modelPrediction") # 模型錯誤率training_acc <- collect(num_errors) / collect(total_errors)training_acc
_c01 0
參考資料
[原]打造數據產品的快速原型:Shiny的Docker之旅
[原]R語言工程化實踐:RStudio Server環境快速配置教程
[譯]打造大數據產品:Shiny的Spark之旅
Tiago Vinícius: SparkR 1.5 MLlib Logistic Regression Example
SparkR: Distributed data frames with Spark and R
SparkR R frontend for Spark
劉志強, et al. "基於 SparkR 的分類演算法並行化研究." Journal of Frontiers of Computer Science and Technology 9.11 (2015): 1281-1294.
用Parallel和foreach包玩轉並行計算
Zeppelin跟SparkR使用spark 1.5+的分析平台建置
推薦閱讀:
※【翻譯】Awesome R資源大全中文版來了,全球最火的R工具包一網打盡,超過300+工具,還在等什麼?
※Learn R | 數據降維之因子分析(下)
※用數據分析的思路找數據分析的工作