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