MapReduce淺析

 用 Mapeduce 來處理大數據集的過程, 這個 MapReduce 的計算過程簡而言之,就是將大數據集分解爲成百上千的小數據集,每一個(或若干個)數據集分別由集羣中的一個結點(通常就是一臺普通的計算機)進行處理並生成中間結果,而後這些中間結果又由大量的結點進行合併, 造成最終結果。 程序員

    計算模型的核心是 Map 和 Reduce 兩個函數這兩個函數由用戶負責實現,功能是按必定的映射規則將輸入的 <key, value> 對轉換成另外一個或一批 <key, value> 對輸出。 編程


                                表 Map 和 Reduce 函數 網絡

函數 輸入 輸出 說明
Map <k1, v1> List(<k2,v2>) 1. 將小數據集進一步解析成一批 <key,value> 對,輸入 Map 函數中進行處理。 
2. 每個輸入的 <k1,v1> 會輸出一批 <k2,v2>。 <k2,v2> 是計算的中間結果。
Reduce <k2,List(v2)> <k3,v3> 輸入的中間結果 <k2,List(v2)> 中的 List(v2) 表示是一批屬於同一個 k2 的 value

   基於 MapReduce 計算模型編寫分佈式並行程序很是簡單,程序員的主要編碼工做就是實現 Map 和 Reduce 函數,其它的並行編程中的種種複雜問題,如分佈式存儲,工做調度,負載平衡,容錯處理,網絡通訊等,均由 MapReduce 框架(好比 Hadoop )負責處理,程序員徹底不用操心。 框架

本地計算 分佈式

   數據存儲在哪一臺計算機上,就由這臺計算機進行這部分數據的計算,這樣能夠減小數據在網絡上的傳輸,下降對網絡帶寬的需求。在 Hadoop 這樣的基於集羣的分佈式並行系統中,計算結點能夠很方便地擴充,而因它所可以提供的計算能力近乎是無限的,可是由是數據須要在不一樣的計算機之間流動,故網絡帶寬變成了瓶頸,是很是寶貴的,「本地計算」是最有效的一種節約網絡帶寬的手段,業界把這形容爲「移動計算比移動數據更經濟」。 ide

任務粒度 函數

   把原始大數據集切割成小數據集時,一般讓小數據集小於或等於 HDFS 中一個 Block 的大小(缺省是 64M),這樣可以保證一個小數據集位於一臺計算機上,便於本地計算有 M 個小數據集待處理,就啓動 M 個 Map 任務,注意這 M 個 Map 任務分佈於 N 臺計算機上並行運行,Reduce 任務的數量 R 則可由用戶指定。 oop

Partition 大數據

   把 Map 任務輸出的中間結果按 key 的範圍劃分紅 R 份( R 是預先定義的 Reduce 任務的個數),劃分時一般使用 hash 函數,如: hash(key) mod R,這樣能夠保證某一段範圍內的 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 個最終結果又能夠作爲另外一個計算任務的輸入,開始另外一個並行計算任務。

相關文章
相關標籤/搜索