摘要:R是數(shù)據(jù)科學(xué)家中最流行的編程語(yǔ)言和環(huán)境之一,在Spark中加入對(duì)R的支持是社區(qū)中較受關(guān)注的話題。作為增強(qiáng)Spark對(duì)數(shù)據(jù)科學(xué)家群體吸引力的最新舉措,最近發(fā)布的Spark 1.4版本在現(xiàn)有的Scala/Java/Python API之外增加了R API(SparkR)。SparkR使得熟悉R的用戶可以在Spark的分布式計(jì)算平臺(tái)基礎(chǔ)上結(jié)合R本身強(qiáng)大的統(tǒng)計(jì)分析功能和豐富的第三方擴(kuò)展包,對(duì)大規(guī)模數(shù)據(jù)集進(jìn)行分析和處理。本文將回顧SparkR項(xiàng)目的背景,對(duì)其當(dāng)前的特性作總體的概覽,闡述其架構(gòu)和若干技術(shù)關(guān)鍵點(diǎn),最后進(jìn)行展望和總結(jié)。
項(xiàng)目背景
R是非常流行的數(shù)據(jù)統(tǒng)計(jì)分析和制圖的語(yǔ)言及環(huán)境,有一項(xiàng)調(diào)查顯示,R語(yǔ)言在數(shù)據(jù)科學(xué)家中使用的程度僅次于SQL。但目前R語(yǔ)言的核心運(yùn)行環(huán)境是單線程的,能處理的數(shù)據(jù)量受限于單機(jī)的內(nèi)存容量,大數(shù)據(jù)時(shí)代的海量數(shù)據(jù)處理對(duì)R構(gòu)成了挑戰(zhàn)。
為了解決R的可伸縮性問(wèn)題,R社區(qū)已經(jīng)有一些方案,比如parallel和snow包,可以在計(jì)算機(jī)集群上并行運(yùn)行R代碼。但它們的缺陷在于沒(méi)有解決數(shù)據(jù)分布式存儲(chǔ),數(shù)據(jù)仍然需要在主節(jié)點(diǎn)集中表示,分片后再傳輸給工作節(jié)點(diǎn),不適用于大數(shù)據(jù)處理的場(chǎng)景。另外,數(shù)據(jù)處理模型過(guò)于簡(jiǎn)單,即數(shù)據(jù)分片在工作節(jié)點(diǎn)處理后,結(jié)果收集回主節(jié)點(diǎn),缺少一個(gè)象MapReduce那樣通用的分布式數(shù)據(jù)編程模型。
Hadoop是流行的大數(shù)據(jù)處理平臺(tái),它的HDFS分布式文件系統(tǒng)和之上的MapReduce編程模型比較好地解決了大數(shù)據(jù)分布式存儲(chǔ)和處理的問(wèn)題。RHadoop項(xiàng)目的出現(xiàn)使得用戶具備了在R中使用Hadoop處理大數(shù)據(jù)的能力。
Apache頂級(jí)開(kāi)源項(xiàng)目Spark是Hadoop之后備受關(guān)注的新一代分布式計(jì)算平臺(tái)。和Hadoop相比,Spark提供了分布式數(shù)據(jù)集的抽象,編程模型更靈活和高效,能夠充分利用內(nèi)存來(lái)提升性能。為了方便數(shù)據(jù)科學(xué)家使用Spark進(jìn)行數(shù)據(jù)挖掘,社區(qū)持續(xù)往Spark中加入吸引數(shù)據(jù)科學(xué)家的各種特性,例如0.7.0版本中加入的python API (PySpark);1.3版本中加入的DataFrame等。
R和Spark的強(qiáng)強(qiáng)結(jié)合應(yīng)運(yùn)而生。2013年9月SparkR作為一個(gè)獨(dú)立項(xiàng)目啟動(dòng)于加州大學(xué)伯克利分校的大名鼎鼎的AMPLAB實(shí)驗(yàn)室,與Spark源出同門。2014年1月,SparkR項(xiàng)目在github上開(kāi)源(https://github.com/amplab-extras/SparkR-pkg)。隨后,來(lái)自工業(yè)界的Alteryx、Databricks、Intel等公司和來(lái)自學(xué)術(shù)界的普渡大學(xué),以及其它開(kāi)發(fā)者積極參與到開(kāi)發(fā)中來(lái),最終在2015年4月成功地合并進(jìn)Spark代碼庫(kù)的主干分支,并在Spark 1.4版本中作為重要的新特性之一正式宣布。