摘要:類似包中的功能這很好的解決了的大數(shù)據(jù)級(jí)瓶頸問(wèn)題。也支持分布式的機(jī)器學(xué)習(xí)算法,比如使用機(jī)器學(xué)習(xí)庫(kù)。部署本文將通過(guò)講解如何快速部署容器,并通過(guò)一些簡(jiǎn)單的機(jī)器學(xué)習(xí)例子展示如何使用這個(gè)航母級(jí)別的組合拳。
介紹題圖為美國(guó)尼米茲核動(dòng)力航空母艦
大數(shù)據(jù)時(shí)代,我們常常面對(duì)海量數(shù)據(jù)而頭疼。作為學(xué)統(tǒng)計(jì)出身的人,我們想折騰大數(shù)據(jù)但又不想學(xué)習(xí)Hadoop或者Java,我們更傾向于把精力放在建模和算法設(shè)計(jì)上,SparkR和Docker的完美結(jié)合,讓R的計(jì)算直接從一架戰(zhàn)斗機(jī)的當(dāng)兵作戰(zhàn)華麗轉(zhuǎn)變?yōu)橐粋€(gè)航空母艦戰(zhàn)斗群!不僅僅簡(jiǎn)化了分布式計(jì)算的操作,還簡(jiǎn)化了安裝部署的環(huán)節(jié),我們只幾乎不需要做什么改動(dòng)就可以直接運(yùn)用R中的data frame進(jìn)行分布式的計(jì)算。
什么是SparkR參考前文 打造大數(shù)據(jù)產(chǎn)品:Shiny的Spark之旅,我們可以知道,SparkR是一個(gè)為R提供了輕量級(jí)的Spark前端的R包。 SparkR提供了一個(gè)分布式的data frame數(shù)據(jù)結(jié)構(gòu),解決了 R中的data frame只能在單機(jī)中使用的瓶頸,它和R中的data frame 一樣支持許多操作,比如select,filter,aggregate等等。(類似dplyr包中的功能)這很好的解決了R的大數(shù)據(jù)級(jí)瓶頸問(wèn)題。 SparkR也支持分布式的機(jī)器學(xué)習(xí)算法,比如使用MLib機(jī)器學(xué)習(xí)庫(kù)。
什么是Docker參考前文 打造數(shù)據(jù)產(chǎn)品的快速原型:Shiny的Docker之旅,我們也可以知道,Docker是一種類似于虛擬機(jī)的技術(shù),主要解決標(biāo)準(zhǔn)化快速部署的問(wèn)題,在Docker中安裝的軟件和主機(jī)中的軟件可以完全隔離,并通過(guò)Daocloud或者h(yuǎn)ub.docker.com等云服務(wù)快速建立Docker倉(cāng)庫(kù),快速?gòu)?fù)用Docker鏡像。Docker已經(jīng)不僅僅是DevOps人員手中的神器了,每一個(gè)開發(fā)者都應(yīng)該學(xué)會(huì)如何使用Docker。
為什么要結(jié)合SparkR和DockerSparkR的精髓在于分布式計(jì)算,而Docker的精髓在于標(biāo)準(zhǔn)容器的拓展性,SparkR和Docker的組合充分結(jié)合了二者各自的優(yōu)點(diǎn),將分布式應(yīng)用底層化繁為簡(jiǎn),為高層計(jì)算直接暴露接口,給科學(xué)計(jì)算節(jié)省了大量時(shí)間。
部署本文將通過(guò)Docker講解如何快速部署SparkR-RStudio容器,并通過(guò)一些簡(jiǎn)單的機(jī)器學(xué)習(xí)例子展示如何使用這個(gè)航母級(jí)別的組合拳。
步驟一:安裝Docker和Daocloud由于國(guó)內(nèi)的鏡像質(zhì)量不夠高,國(guó)外的鏡像下載速度比較慢,出于試驗(yàn)的考慮,建議大家可以嘗試使用Daocloud的鏡像加速服務(wù)。
首先,我們需要在Daocloud注冊(cè)一個(gè)賬號(hào),然后選擇鏡像加速,根據(jù)指示選擇主機(jī)并安裝Docker和Daocloud加速器。
步驟二:安裝Spark-RStudio感謝 vinicius85 在GitHub上的開源貢獻(xiàn),為我們已經(jīng)做好了 Spark1.6+R+RStduio的鏡像,我們利用daocloud加速拉取鏡像。
dao pull vinicius85/spark-rstudio
以daemon形式運(yùn)行容器,暴露Rstudio-server默認(rèn)的8787端口, 并持久化docker內(nèi)的/srv目錄下的所有文件作為通訊。
docker run -d -v /home/docker:/srv -p 8787:8787 --name sparkrstudio vinicius85/sparkr-rstudio
或者通過(guò)下面最新的方式安裝
docker run -d -p 8787:8787 --name financer index.tenxcloud.com/7harryprince/sparkr-rstudio?步驟三:配置RStudio登陸賬號(hào)
參考前文 R語(yǔ)言工程化實(shí)踐:RStudio Server環(huán)境快速配置教程
docker exec -d sparkrstudio bash命令表示以daemon形式執(zhí)行容器中的shell腳本
我們?cè)O(shè)置一下RStudio-Server的賬號(hào)密碼
docker exec -d sparkrstudio bash adduser harryzhu # 設(shè)置新用戶名 docker exec -d sparkrstudio bash passwd harryzhu # 設(shè)置該用戶的密碼步驟四:登陸RStudio
ifconfig命令可以查看到Docker當(dāng)前的IP地址,透過(guò)這個(gè)IP,我們可以訪問(wèn)到RStudio-Server。
比如:
查看資源占用情況
docker stats sparkrstudio
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O sparkrstudio 4.50% 481.3 MB / 5.039 GB 9.55% 133.6 kB / 117.4 kB 3.252 MB / 135.2 kB機(jī)器學(xué)習(xí)示例:
出于演示的考慮,這里引用并稍微改進(jìn)了 tcosta 完成的一個(gè)邏輯回歸的例子:
初始化使用SparkR之前,我們需要確定,我們的容器內(nèi)存要在2G以上,如果用AWS的乞丐版套裝,馬上就會(huì)報(bào)內(nèi)存不足的錯(cuò)誤。
Error in sparkR.init(master = "local") : JVM is not ready after 10 seconds
如果內(nèi)存不足,可以退出docker并且在虛擬機(jī)中重新提高docker的內(nèi)存和cpu的配置。
# 配置環(huán)境變量 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) # 初始化RRD #sc <- sparkR.init(master = "local") #sqlContext <- sparkRSQL.init(sc) # spark 2.0 后改為 sc <- sparkR.session(master = "local") # 創(chuàng)建DataFrame #mtcarsDF <- createDataFrame(sqlContext, mtcars) mtcarsDF <- createDataFrame( mtcars) head(mtcarsDF)
mpg cyl disp hp drat wt qsec vs am gear carb 1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 6 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 prediction 1 0 0.58006945 2 0 0.64060709 3 1 0.72468718 4 1 0.47803842 5 0 0.06070972 6 1 0.54994276模型評(píng)估
# error變量: 觀測(cè)值和預(yù)測(cè)值的差值 modelPrediction$error <- abs(modelPrediction$vs - modelPrediction$prediction) # modelPrediction 現(xiàn)在對(duì) SQLContext 是可見的 # registerTempTable(modelPrediction, "modelPrediction") # Spark 2.0 之后api改為 createTempTable(modelPrediction, "modelPrediction") #num_errors <- sql(sqlContext, "SELECT count(error) FROM modelPrediction WHERE error = 1") #total_errors <- sql(sqlContext, "SELECT count(error) FROM modelPrediction") num_errors <- sql( "SELECT count(error) FROM modelPrediction WHERE error = 1") total_errors <- sql( "SELECT count(error) FROM modelPrediction") # 模型錯(cuò)誤率 training_acc <- collect(num_errors) / collect(total_errors) training_acc
_c0 1 0參考資料
打造數(shù)據(jù)產(chǎn)品的快速原型:Shiny的Docker之旅
R語(yǔ)言工程化實(shí)踐:RStudio Server環(huán)境快速配置教程
打造大數(shù)據(jù)產(chǎn)品: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
劉志強(qiáng), et al. "基于 SparkR 的分類算法并行化研究." Journal of Frontiers of Computer Science and Technology 9.11 (2015): 1281-1294.
用Parallel和foreach包玩轉(zhuǎn)并行計(jì)算
Zeppelin跟SparkR使用spark 1.5+的分析平臺(tái)建置
Fast learn scala
Spark在美團(tuán)的實(shí)踐
作為分享主義者(sharism),本人所有互聯(lián)網(wǎng)發(fā)布的圖文均遵從CC版權(quán),轉(zhuǎn)載請(qǐng)保留作者信息并注明作者 Harry Zhu 的 FinanceR專欄:https://segmentfault.com/blog...,如果涉及源代碼請(qǐng)注明GitHub地址:https://github.com/harryprince。微信號(hào): harryzhustudio
商業(yè)使用請(qǐng)聯(lián)系作者。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/26554.html
摘要:概述我非常認(rèn)同前百度數(shù)據(jù)工程師現(xiàn)神策分析創(chuàng)始人桑老師最近談到的數(shù)據(jù)分析三重境界統(tǒng)計(jì)計(jì)數(shù)多維分析機(jī)器學(xué)習(xí)數(shù)據(jù)分析的統(tǒng)計(jì)計(jì)數(shù)和多維分析,我們通常稱之為數(shù)據(jù)探索式分析,這個(gè)步驟旨在了解數(shù)據(jù)的特性,有助于我們進(jìn)一步挖掘數(shù)據(jù)的價(jià)值。 showImg(https://camo.githubusercontent.com/f98421e503a81176b003ddd310d97e1e1214625...
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來(lái)意思。閱讀本期技術(shù)周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達(dá)的境界。周刊篩選的每篇內(nèi)容,是作者的獨(dú)到見解,踩坑總結(jié)和經(jīng)驗(yàn)分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動(dòng)感十足的清脆鍵盤響,我就能猜到公司程序員定...
摘要:在實(shí)際的工程中,我們的服務(wù)器大多是基于的,比如常見的等。這一次,我們將繼續(xù)利用神器,快速初始化環(huán)境的配置,并結(jié)合實(shí)現(xiàn)代碼的版本控制。對(duì)于的問(wèn)題,我們可以選擇建立一個(gè)認(rèn)證的,也可以在中設(shè)置為忽略。 介紹 RStudio Server 是 RStudio 公司打造的一款基于 Web 的開源編輯器,如果你熟悉 RStudio的桌面版本,那么使用RStudio Server對(duì)你來(lái)說(shuō)基本上沒什么...
摘要:標(biāo)識(shí)符與關(guān)鍵字標(biāo)識(shí)符指類名包括接口枚舉抽象類方法名變量常量名包名等可以自定義的字符組合。如果基本功能在不斷改變,那么就需要使用抽象類。抽象類可以實(shí)現(xiàn)接口,抽象類是否可繼承實(shí)體類,但前提是實(shí)體類必須有明確的構(gòu)造函數(shù)。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所結(jié),不管...
閱讀 952·2021-09-26 09:55
閱讀 3205·2021-09-22 15:36
閱讀 2987·2021-09-04 16:48
閱讀 3147·2021-09-01 11:41
閱讀 2597·2019-08-30 13:49
閱讀 1495·2019-08-29 18:46
閱讀 3552·2019-08-29 17:28
閱讀 3433·2019-08-29 14:11