開源框架Hadoop實現(xiàn)分布式計算
本節(jié)和大家一起學(xué)習(xí)一下分布式計算開源框架Hadoop,本節(jié)主要內(nèi)容有Hadoop概念的介紹和Hadoop相關(guān)計算方法,希望通過本節(jié)的學(xué)習(xí),大家對Hadoop的分布式計算有一定的認(rèn)識。
分布式計算開源框架Hadoop介紹
引用
Hadoop是Apache開源組織的一個分布式計算開源框架,在很多大型網(wǎng)站上都已經(jīng)得到了應(yīng)用,如亞馬遜、Facebook和Yahoo等等。對于我來說,最近的一個使用點就是服務(wù)集成平臺的日志分析。服務(wù)集成平臺的日志量將會很大,而這也正好符合了分布式計算的適用場景
什么是Hadoop?
搞什么東西之前,***步是要知道What(是什么),然后是Why(為什么),***才是How(怎么做)。但很多開發(fā)的朋友在做了多年項目以后,都習(xí)慣是先How,然后What,***才是Why,這樣只會讓自己變得浮躁,同時往往會將技術(shù)誤用于不適合的場景。
Hadoop框架中最核心的設(shè)計就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapReduce就是“任務(wù)的分解與結(jié)果的匯總”。HDFS是Hadoop分布式文件系統(tǒng)(HadoopDistributedFileSystem)的縮寫,為分布式計算存儲提供了底層支持。
MapReduce從它名字上來看就大致可以看出個緣由,兩個動詞Map和Reduce,“Map(展開)”就是將一個任務(wù)分解成為多個任務(wù),“Reduce”就是將分解后多任務(wù)處理的結(jié)果匯總起來,得出***的分析結(jié)果。這不是什么新思想,其實在前面提到的多線程,多任務(wù)的設(shè)計就可以找到這種思想的影子。不論是現(xiàn)實社會,還是在程序設(shè)計中,一項工作往往可以被拆分成為多個任務(wù),任務(wù)之間的關(guān)系可以分為兩種:一種是不相關(guān)的任務(wù),可以并行執(zhí)行;另一種是任務(wù)之間有相互的依賴,先后順序不能夠顛倒,這類任務(wù)是無法并行處理的?;氐酱髮W(xué)時期,教授上課時讓大家去分析關(guān)鍵路徑,無非就是找最省時的任務(wù)分解執(zhí)行方式。在分布式系統(tǒng)中,機(jī)器集群就可以看作硬件資源池,將并行的任務(wù)拆分,然后交由每一個空閑機(jī)器資源去處理,能夠極大地提高計算效率,同時這種資源無關(guān)性,對于計算集群的擴(kuò)展無疑提供了***的設(shè)計保證。(其實我一直認(rèn)為Hadoop的卡通圖標(biāo)不應(yīng)該是一個小象,應(yīng)該是螞蟻,分布式計算就好比螞蟻吃大象,廉價的機(jī)器群可以匹敵任何高性能的計算機(jī),縱向擴(kuò)展的曲線始終敵不過橫向擴(kuò)展的斜線)。任務(wù)分解處理以后,那就需要將處理以后的結(jié)果再匯總起來,這就是Reduce要做的工作。
MapReduce結(jié)構(gòu)示意圖
集群上的并行計算
MapReduce計算模型非常適合在大量計算機(jī)組成的大規(guī)模集群上并行運(yùn)行。圖一中的每一個Map任務(wù)和每一個Reduce任務(wù)均可以同時運(yùn)行于一個單獨的計算結(jié)點上,可想而知其運(yùn)算效率是很高的,那么這樣的并行計算是如何做到的呢?
數(shù)據(jù)分布存儲
Hadoop中的分布式文件系統(tǒng)HDFS由一個管理結(jié)點(NameNode)和N個數(shù)據(jù)結(jié)點(DataNode)組成,每個結(jié)點均是一臺普通的計算機(jī)。在使用上同我們熟悉的單機(jī)上的文件系統(tǒng)非常類似,一樣可以建目錄,創(chuàng)建,復(fù)制,刪除文件,查看文件內(nèi)容等。但其底層實現(xiàn)上是把文件切割成Block,然后這些Block分散地存儲于不同的DataNode上,每個Block還可以復(fù)制數(shù)份存儲于不同的DataNode上,達(dá)到容錯容災(zāi)之目的。NameNode則是整個HDFS的核心,它通過維護(hù)一些數(shù)據(jù)結(jié)構(gòu),記錄了每一個文件被切割成了多少個Block,這些Block可以從哪些DataNode中獲得,各個DataNode的狀態(tài)等重要信息。如果你想了解更多的關(guān)于HDFS的信息,可進(jìn)一步閱讀參考資料:TheHadoopDistributedFileSystem:ArchitectureandDesign
分布式并行計算
Hadoop中有一個作為主控的JobTracker,用于調(diào)度和管理其它的TaskTracker,JobTracker可以運(yùn)行于集群中任一臺計算機(jī)上。TaskTracker負(fù)責(zé)執(zhí)行任務(wù),必須運(yùn)行于DataNode上,即DataNode既是數(shù)據(jù)存儲結(jié)點,也是計算結(jié)點。JobTracker將Map任務(wù)和Reduce任務(wù)分發(fā)給空閑的TaskTracker,讓這些任務(wù)并行運(yùn)行,并負(fù)責(zé)監(jiān)控任務(wù)的運(yùn)行情況。如果某一個TaskTracker出故障了,JobTracker會將其負(fù)責(zé)的任務(wù)轉(zhuǎn)交給另一個空閑的TaskTracker重新運(yùn)行。
本地計算
數(shù)據(jù)存儲在哪一臺計算機(jī)上,就由這臺計算機(jī)進(jìn)行這部分?jǐn)?shù)據(jù)的計算,這樣可以減少數(shù)據(jù)在網(wǎng)絡(luò)上的傳輸,降低對網(wǎng)絡(luò)帶寬的需求。在Hadoop這樣的基于集群的分布式并行系統(tǒng)中,計算結(jié)點可以很方便地擴(kuò)充,而因它所能夠提供的計算能力近乎是無限的,但是由是數(shù)據(jù)需要在不同的計算機(jī)之間流動,故網(wǎng)絡(luò)帶寬變成了瓶頸,是非常寶貴的,“本地計算”是最有效的一種節(jié)約網(wǎng)絡(luò)帶寬的手段,業(yè)界把這形容為“移動計算比移動數(shù)據(jù)更經(jīng)濟(jì)”。
Hadoop分布存儲與并行計算
任務(wù)粒度
把原始大數(shù)據(jù)集切割成小數(shù)據(jù)集時,通常讓小數(shù)據(jù)集小于或等于HDFS中一個Block的大小(缺省是64M),這樣能夠保證一個小數(shù)據(jù)集位于一臺計算機(jī)上,便于本地計算。有M個小數(shù)據(jù)集待處理,就啟動M個Map任務(wù),注意這M個Map任務(wù)分布于N臺計算機(jī)上并行運(yùn)行,Reduce任務(wù)的數(shù)量R則可由用戶指定。
Partition
把Map任務(wù)輸出的中間結(jié)果按key的范圍劃分成R份(R是預(yù)先定義的Reduce任務(wù)的個數(shù)),劃分時通常使用hash函數(shù)如:hash(key)modR,這樣可以保證某一段范圍內(nèi)的key,一定是由一個Reduce任務(wù)來處理,可以簡化Reduce的過程。
Combine
在partition之前,還可以對中間結(jié)果先做combine,即將中間結(jié)果中有相同key的<key,value>對合并成一對。combine的過程與Reduce的過程類似,很多情況下就可以直接使用Reduce函數(shù),但combine是作為Map任務(wù)的一部分,在執(zhí)行完Map函數(shù)后緊接著執(zhí)行的。Combine能夠減少中間結(jié)果中<key,value>對的數(shù)目,從而減少網(wǎng)絡(luò)流量。
Reduce任務(wù)從Map任務(wù)結(jié)點取中間結(jié)果
Map任務(wù)的中間結(jié)果在做完Combine和Partition之后,以文件形式存于本地磁盤。中間結(jié)果文件的位置會通知主控JobTracker,JobTracker再通知Reduce任務(wù)到哪一個DataNode上去取中間結(jié)果。注意所有的Map任務(wù)產(chǎn)生中間結(jié)果均按其Key用同一個Hash函數(shù)劃分成了R份,R個Reduce任務(wù)各自負(fù)責(zé)一段Key區(qū)間。每個Reduce需要向許多個Map任務(wù)結(jié)點取得落在其負(fù)責(zé)的Key區(qū)間內(nèi)的中間結(jié)果,然后執(zhí)行Reduce函數(shù),形成一個最終的結(jié)果文件。
任務(wù)管道
有R個Reduce任務(wù),就會有R個最終結(jié)果,很多情況下這R個最終結(jié)果并不需要合并成一個最終結(jié)果。因為這R個最終結(jié)果又可以做為另一個計算任務(wù)的輸入,開始另一個并行計算任務(wù)。就是MapReduce大致的結(jié)構(gòu)圖,在Map前還可能會對輸入的數(shù)據(jù)有Split(分割)的過程,保證任務(wù)并行效率,在Map之后還會有Shuffle(混合)的過程,對于提高Reduce的效率以及減小數(shù)據(jù)傳輸?shù)膲毫τ泻艽蟮膸椭?。后面會具體提及這些部分的細(xì)節(jié)。
HDFS是分布式計算的存儲基石,Hadoop的分布式文件系統(tǒng)和其他分布式文件系統(tǒng)有很多類似的特質(zhì)。分布式文件系統(tǒng)基本的幾個特點:
對于整個集群有單一的命名空間。
數(shù)據(jù)一致性。適合一次寫入多次讀取的模型,客戶端在文件沒有被成功創(chuàng)建之前無法看到文件存在。
文件會被分割成多個文件塊,每個文件塊被分配存儲到數(shù)據(jù)節(jié)點上,而且根據(jù)配置會由復(fù)制文件塊來保證數(shù)據(jù)的安全性。本節(jié)關(guān)于分布式計算開源框架Hadoop方面的內(nèi)容介紹完畢。
【編輯推薦】
- Hadoop概念及其用法專家講解
- 專家指導(dǎo) 如何進(jìn)行Hadoop分布式集群配置
- Hadoop集群與Hadoop性能優(yōu)化
- HadoopHBase實現(xiàn)配置簡單的單機(jī)環(huán)境
- Hadoop配置指導(dǎo)手冊