何海林1,2,皮建勇1,2
1.貴州大學(xué) 計(jì)算機(jī)科學(xué)與信息學(xué)院,貴州 貴陽(yáng) 550025; 2.貴州大學(xué) 云計(jì)算與物聯(lián)網(wǎng)研究中心,貴州 貴陽(yáng) 550025
摘 要: 雖然以MapReduce和Hadoop分布式系統(tǒng)(HDFS)為核心的Hadoop已在大規(guī)模數(shù)據(jù)密集的商業(yè)領(lǐng)域成功應(yīng)用,但是對(duì)于多個(gè)并行操作之間重用工作數(shù)據(jù)集卻表現(xiàn)不佳。作為對(duì)其的一種補(bǔ)充,本文介紹了Spark。首先介紹Hadoop的MapReduce與HDFS基本概念與設(shè)計(jì)思想,然后介紹了Spark的基本概念與思想,并且著重介紹了彈性分布式數(shù)據(jù)集RDD,并通過實(shí)驗(yàn)證明和分析對(duì)比了Hadoop與Spark。
關(guān)鍵詞: Hadoop;MapReduce;HDFS;Spark;彈性分布式數(shù)據(jù)集
0 引言
在這個(gè)知識(shí)爆炸性增長(zhǎng)的社會(huì),隨著各種技術(shù)的進(jìn)步,人們?cè)絹碓揭蕾嚿磉叺母鞣N終端設(shè)備進(jìn)行各種各樣的生產(chǎn)生活,而這些設(shè)備會(huì)產(chǎn)生大量的數(shù)據(jù)。如何從這些數(shù)據(jù)中高效地獲得有用信息成為一個(gè)有經(jīng)濟(jì)價(jià)值的問題。Hadoop[1]憑借其良好的出身與優(yōu)越的性能,如高可靠性、高可擴(kuò)展性、高效性,并且它是開源的,已經(jīng)成為大數(shù)據(jù)分析的標(biāo)準(zhǔn)框架。但是Hadoop并不適用于所有場(chǎng)合,它有其本身不可克服的缺點(diǎn),如訪問時(shí)間延遲過長(zhǎng)不適用于時(shí)間要求較高的應(yīng)用,代碼越來越長(zhǎng)限制了它更大規(guī)模的應(yīng)用。這時(shí)候Spark[2]異軍突起,克服了Hadoop的眾多缺點(diǎn)。
1 Hadoop
Hadoop是Apach的一個(gè)開源項(xiàng)目,Hadoop提供了一個(gè)分布式文件系統(tǒng)(HDFS)[3]和一個(gè)用于分析和轉(zhuǎn)化大規(guī)模數(shù)據(jù)集的MapReduce[4]框架,Hadoop的一個(gè)重要特點(diǎn)就是通過對(duì)數(shù)據(jù)進(jìn)行分割在多臺(tái)主機(jī)上進(jìn)行運(yùn)行,并且并行地執(zhí)行應(yīng)用計(jì)算。其中HDFS用于存儲(chǔ)數(shù)據(jù),MapReduce是Google公司的一項(xiàng)重要技術(shù),后被模仿,它主要采用并行計(jì)算的方法用于對(duì)大數(shù)據(jù)的計(jì)算。它們之間的關(guān)系如圖1。以Hadoop分布式文件系統(tǒng)和MapReduce分布式計(jì)算框架為核心,為用戶提供了底層細(xì)節(jié)透明的分布式基礎(chǔ)設(shè)施。HDFS的高容錯(cuò)性和高彈性的優(yōu)點(diǎn),允許用戶將其部署到廉價(jià)的機(jī)器上,構(gòu)建分布式系統(tǒng)。MapReduce分布式計(jì)算框架允許用戶在不了解分布式系統(tǒng)底層細(xì)節(jié)的情況下開發(fā)并行分布的應(yīng)用程序,充分利用大規(guī)模的計(jì)算資源,解決傳統(tǒng)單機(jī)無法解決的大數(shù)據(jù)處理問題。
1.1 MapReduce編程模型
正與其名字一樣,MapReduce包含兩項(xiàng)關(guān)鍵操作:Map與Reduce,兩者來源于函數(shù)式編程語言,并且作為MapReduce的兩項(xiàng)核心操作由用戶編程完成。如圖2,MapReduce模型包含Map、Shuffle和Reduce三個(gè)階段。
Map階段:輸入數(shù)據(jù)被系統(tǒng)分為相互獨(dú)立的片塊,這些小塊同時(shí)被Map處理,在用戶指定的Map程序中執(zhí)行,最大限度地利用并行處理產(chǎn)生結(jié)果,最后Map階段的輸出作為Reduce階段的輸入。
Shuffle階段:將具有相同鍵的記錄送到同一個(gè)Reduce。
Reduce階段:將Shuffle的輸出作為輸入進(jìn)行處理產(chǎn)生最終結(jié)果。
在MapReduce中的處理主要靠鍵值對(duì)實(shí)現(xiàn)。例如輸入的記錄用<Key1,Value1>表示,在Map階段讀入記錄處理產(chǎn)生結(jié)果,Map階段的輸出用模式<Key2,Value2>表示,如果幾個(gè)記錄需要在Reduce階段一起處理,那么這些記錄就會(huì)被同一個(gè)Reduce處理,在Shuffle階段,將具有相同鍵的送到同一個(gè)Reduce,這樣,在Reduce階段Map階段的輸出被最終輸出為<Key3,Value3>。可以用下面的式子表示:
Map:(K1,V1)->list(K2,V2)
Reduce:(K2,list(V2))->list(K3,V3)
1.2 HDFS
HDFS當(dāng)初被發(fā)展主要是為了實(shí)現(xiàn)與GFS[5]相似的功能,HDFS是Hadoop的文件系統(tǒng)的組件,它的接口與UNIX文件系統(tǒng)相似,犧牲了標(biāo)準(zhǔn),是為了提高應(yīng)用的性能。
HDFS正如GFS一樣將系統(tǒng)數(shù)據(jù)與應(yīng)用數(shù)據(jù)分開進(jìn)行存放。存放元數(shù)據(jù)在專門的服務(wù)器上,叫做NameNode,應(yīng)用數(shù)據(jù)存放在其他服務(wù)器上叫做DataNode,所有的服務(wù)器通過TCP協(xié)議來進(jìn)行連接。不同于Lustre[6]與PVFS[7],數(shù)據(jù)節(jié)點(diǎn)在HDFS不采用數(shù)據(jù)保護(hù)機(jī)制,例如磁盤陣列RAID來確保數(shù)據(jù)的持久性,而是采用與GFS類似的方式將數(shù)據(jù)目錄復(fù)制到多個(gè)數(shù)據(jù)節(jié)點(diǎn)來保證其可靠性,并能保證數(shù)據(jù)的持久性,這種策略恰好又讓數(shù)據(jù)傳輸?shù)膸捥岣吡硕啾叮梢宰寯?shù)據(jù)存放在離局部計(jì)算更近的地方,幾個(gè)分布式文件系統(tǒng)或多或少地實(shí)現(xiàn)了命名空間。
2 Spark
Spark誕生于美國(guó)加州理工大學(xué)AMPLab集群計(jì)算平臺(tái),利用內(nèi)存計(jì)算速度快的特點(diǎn),并從MapReduce不適用于在多個(gè)并行操作之間重用工作數(shù)據(jù)集(多迭代批量處理與交互式數(shù)據(jù)分析)的特點(diǎn)出發(fā),在流處理和圖計(jì)算等多種計(jì)算范式具有更加強(qiáng)的能力。由此提出了一種新的架構(gòu)叫做Spark,用于處理迭代機(jī)器學(xué)習(xí)算法,以保持像MapReduce一樣的高擴(kuò)展性與容錯(cuò)能力。Spark引入了RDD,即彈性分布式數(shù)據(jù)集(resilient distributed datasets,RDD)[8]。
Spark是通過Scala[9]實(shí)現(xiàn)的一種基于Java虛擬機(jī)的高級(jí)編程語言,提供類似于DryadLINQ的編程接口,這樣編寫并行任務(wù)變得非常方便。同時(shí)Spark還可以修改Scala的編譯器,與Ruby和Python一樣,Scala也提供了一個(gè)交互式shell。實(shí)現(xiàn)時(shí)間延遲減少的方法主要是基于內(nèi)存的數(shù)據(jù),通過允許用戶從解釋器交互式地運(yùn)行Spark,從而可以在大數(shù)據(jù)集上實(shí)現(xiàn)大規(guī)模并行數(shù)據(jù)挖掘。雖然現(xiàn)階段Spark還是一個(gè)原型,但是前途還是令人鼓舞的。實(shí)驗(yàn)表明,在處理迭代式應(yīng)用上Spark比Hadoop的速度提高20多倍,計(jì)算數(shù)據(jù)分析類報(bào)表的性能提高了40多倍,在交互式查詢39 GB數(shù)據(jù)集時(shí)可以達(dá)到次秒級(jí)響應(yīng)時(shí)間。
Spark應(yīng)用稱為driver,實(shí)現(xiàn)單個(gè)節(jié)點(diǎn)或多個(gè)節(jié)點(diǎn)上的操作。與Hadoop一樣,Spark支持單節(jié)點(diǎn)和多節(jié)點(diǎn)集群,可以在Hadoop文件系統(tǒng)中并行運(yùn)行。通過名為Mesos[10]的第三方集群框架可以支持此行為。這種配置的優(yōu)點(diǎn)是:允許Spark與Hadoop共用一個(gè)節(jié)點(diǎn)共享池,擴(kuò)大了應(yīng)用范圍。
要想使用Spark,開發(fā)者需要編寫一個(gè)Driver程序,連接到集群以運(yùn)行worker,如圖3所示。Driver定義了一個(gè)或多個(gè)RDD,并調(diào)用RDD上的動(dòng)作。worker是長(zhǎng)時(shí)間運(yùn)行的進(jìn)程,將RDD分區(qū)以Java對(duì)象的形式緩存在內(nèi)存中。
RDD是一種分布式的內(nèi)存抽象。Spark引入的RDD采用了Scala編程風(fēng)格,因?yàn)镾cala特性決定了RDD是一個(gè)Scala表示的對(duì)象,RDD不需要存在于物理存儲(chǔ)中。RDD的一個(gè)句柄包含足夠的信息計(jì)算RDD,這就意味著RDD可以以四種方式重建[11]:
?。?)改變已有RDD的持久性,RDD是懶散和短暫的,數(shù)據(jù)集在進(jìn)行并行操作時(shí)已經(jīng)按照要求進(jìn)行了實(shí)例化(如請(qǐng)求將已有RDD緩存在內(nèi)存中,之后會(huì)被拋出內(nèi)存)。
?。?)從其他RDD轉(zhuǎn)換得來,一個(gè)數(shù)據(jù)集元素類型為A可以通過調(diào)用flatmap轉(zhuǎn)換為數(shù)據(jù)類型B。
?。?)將Driver中Scala的集合劃分為并行切片,分布在各個(gè)節(jié)點(diǎn)之間。
?。?)一個(gè)從文件系統(tǒng)創(chuàng)建的Scala對(duì)象。
RDD的以上操作決定了它有數(shù)據(jù)流的特點(diǎn),比如:位置感知調(diào)度、強(qiáng)大的自動(dòng)容錯(cuò),以及很好的可伸縮性。這樣在有多個(gè)查詢請(qǐng)求時(shí)Spark會(huì)將工作集緩存在內(nèi)存中,如果內(nèi)存不夠用,可以寫到硬盤上,后續(xù)查詢時(shí)提高了重用度,可以讓查詢速度有質(zhì)的提升。
3 實(shí)驗(yàn)
3.1 實(shí)現(xiàn)設(shè)置
本次實(shí)驗(yàn)采用4 000家餐廳140萬條點(diǎn)評(píng)數(shù)據(jù),先預(yù)處理,再通過運(yùn)行K-means算法[12]將數(shù)據(jù)分為四類,對(duì)比在兩種平臺(tái)上的迭代時(shí)間。K-means算法是聚類算法中最簡(jiǎn)單的一種,它需要不斷地迭代直到收斂。
設(shè)備:3臺(tái)內(nèi)存為2 GB、硬盤為500 GB的PC安裝搭建Hadoop后再安裝Spark,其中K-means的Scala的主要代碼為:
val sparkConf=new SparkConf().setAppName("SparkKMeans")
val sc=new SparkContext(sparkConf)
val lines=sc.textFile(args(0))
迭代時(shí)間花費(fèi)如圖4所示。
3.2 結(jié)果分析與兩者對(duì)比
在搭建實(shí)驗(yàn)環(huán)境與編寫實(shí)驗(yàn)程序階段可以看出,Spark提供了與Scala、Java、Python編程一樣的高級(jí)API,這樣便于開發(fā)并發(fā)處理應(yīng)用程序。Hadoop每一次迭代會(huì)在工作集上反復(fù)調(diào)用一個(gè)函數(shù),每一次迭代都可以看做是Mapduce的任務(wù),每一次任務(wù)的執(zhí)行,都需要從硬盤重新下載數(shù)據(jù),這會(huì)顯著地增加時(shí)間延遲,而Spark卻不用從硬盤調(diào)用,只需從內(nèi)存調(diào)用。
兩者對(duì)比,Spark相較于Hadoop最顯著的特征就是快,Spark對(duì)于小數(shù)據(jù)集能夠達(dá)到亞秒級(jí)的延遲,這相對(duì)于Hadoop MapReduce由于“心跳機(jī)制”要花費(fèi)數(shù)秒的性能而言無疑是飛躍,Hadoop經(jīng)常被用于在大數(shù)據(jù)上通過Sql接口(如Pig和Hive)運(yùn)行Ad-hoc探索性查詢,實(shí)際上用戶可以將數(shù)據(jù)集裝載到內(nèi)存進(jìn)行查詢,然而,Hadoop通過MapReduce任務(wù)進(jìn)行,由于反復(fù)從硬盤讀取數(shù)據(jù),因此它的延遲非常大。其次,首先安裝的是Hadoop,最后安裝的是Spark,后者借助前者的基礎(chǔ),與其實(shí)現(xiàn)了完美融合,憑借Scala(被業(yè)界譽(yù)為未來Java的取代者)的強(qiáng)大功能,Scala能運(yùn)行在運(yùn)行JVM的任何地方,還可以充分利用大量現(xiàn)存的Java庫(kù)和現(xiàn)有的Java代碼。因此,Spark只需要稍作修改,就可以交互式編程。通過對(duì)比代碼數(shù)量可以發(fā)現(xiàn),由于Scala的簡(jiǎn)潔性以及Spark非常好地利用了Hadoop和Mesos的基礎(chǔ)設(shè)施,Spark代碼量明顯少了許多。
4 結(jié)束語
本文介紹了Hadoop與Spark的基本概念與設(shè)計(jì)思想??梢钥闯鯯park實(shí)際上作為對(duì)Hadoop的一種補(bǔ)充,在處理迭代工作與交互式數(shù)據(jù)分析方面具有優(yōu)越性。兩者開始顯現(xiàn)出一種融合的趨勢(shì),從Hadoop 0.23把MapReduce做成庫(kù)開始,Hadoop的目標(biāo)就是要支持包括MapReduce在內(nèi)的更多的并行計(jì)算模型,比如MPI、Spark等。未來隨著技術(shù)的發(fā)展究竟誰會(huì)被取代很難預(yù)料,應(yīng)當(dāng)取長(zhǎng)補(bǔ)短,優(yōu)勢(shì)互補(bǔ)。新的需求會(huì)產(chǎn)生新的平臺(tái),如為了強(qiáng)調(diào)實(shí)時(shí)性而發(fā)展的Storm[13],常用于實(shí)時(shí)性要求較高的地方。未來如何實(shí)現(xiàn)更多融合,是一個(gè)值得發(fā)展的方向。
參考文獻(xiàn)
[1] WHITE T. Hadoop: the definitive guide: the definitive guide[Z]. O′Reilly Media, Inc., 2009.
[2] INCUBATOR A. Spark: Lightning-fast cluster computing[Z]. 2013.
[3] SHVACHKO K, KUANG H, RADIA S, et al. The hadoop distributed file system[C].Mass Storage Systems and Technologies(MSST), 2010 IEEE 26th Symposium on. IEEE, 2010:1-10.
[4] DEAN J, GHEMAWAT S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008,51(1):107-113.
[5] GHEMAWAT S, GOBIOFF H, LEUNG S T. The Google file system[C]. ACM SIGOPS operating systems review, ACM, 2003,37(5):29-43.
[6] BRAAM P J. The Lustre storage architecture[Z]. 2004.
[7] ROSS R B, THAKUR R. PVFS: A parallel file system for Linux clusters[C]. Proceedings of the 4th annual Linux showcase and conference, 2000:391-430.
[8] ZAHARIA M, CHOWDHURY M, DAS T, et al. Resilient distributed datasets: a fault-tolerant abstraction for in-memory cluster computing[C]. Proceedings of the 9th USENIX Conference on Networked Systems Design and Implementation. USENIX Association, 2012:2-2.
[9] ODERSKY M, SPOON L, VENNERS B. Programming in scala[M]. Artima Inc, 2008.
[10] HINDMAN B, KONWINSKI A, ZAHARIA M, et al. Mesos: a platform for Fine-Grained resource sharing in the data center[C]. NSDI, 2011: 22-22.
[11] ZAHARIA M, CHOWDHURY M, FRANKLIN M J, et al. Spark: cluster computing with working sets[C]. Proceedings of the 2nd USENIX conference on hot topics in cloud computing, 2010:10.
[12] WAGSTAFF K, CARDIE C, ROGERS S, et al. Constrained k-means clustering with background knowledge[C]. ICML, 2001:577-584.
[13] MARZ N. Storm: distributed and fault-tolerant realtime computation[Z]. 2013.