分布式數據處理MapReduce

jopen 11年前發布 | 24K 次閱讀 MapReduce 分布式/云計算/大數據

  MapReduce是google提出的一個軟件架構,是一種處理海量數據的并行編程模式,用于大規模數據集(通常大于1TB)的并行運算。

MapReduce封裝了并行處理,容錯處理,本地化計算,負載均衡等細節,還提供了一個簡單而強大的接口。

MapReduce把對數據集的大規模操作,分發給一個節點管理下的哥哥節點共同完成,通過這種方式實現任務的可靠執行與容錯機制。在每個時間周期,主節點都會對分節點的工作狀態進行標記,一旦分節點狀態標為死亡狀態,則這個節點的所有任務都會分配給其他節點重新執行。

1.MapReduce的編程模型

簡單的說,Map函數就是對一部分原始數據進行指定的操作。Map之間是并行化的。Reduce操作就是對每個Map所產生的一部分中間結果進行合并操作,每個Reduce所處理的Map中間結果是不交叉的,所有Reduce產生的中間結果經過簡單鏈接就形成了完成的結果集,因此Reduce也可以在并行環境下執行。

兩個主要函數

Map:(in_key,in_value) –>>{(key_j,value_j)|j=1…k}

Reduce:(key,[value_1,value_2,…value_m])->>(key,final_value)

2.MapReduce實現機制

用戶程序條用MapReduce函數后,會引起下面的操作過程

MapReduce函數首先把輸入文件分成M塊,每塊大概在16-64MB(可以通過參數決定),接著在集群的機器上執行分派處理程序

 

這些分派的執行程序中有一個程序比較特別,它是主控程序Master。剩下的執行程序都是作為Master分派工作的Worker(工作機)。總共有M個Map任務和R個Reduce任務需要分派,Master選擇空閑的Worker來分配這些Map或Reduce任務。

 

一個被分配了Map任務的Worker讀取并處理相關的輸入塊。它處理輸入的數據,并且將分析出<key,value>對傳遞給用戶定義的Map函數。Map函數產生的中間結果<key,value>對暫時緩沖到內存中

 

這些緩存到內存的中間結果將定時寫到本地硬盤,這些數據通過分區函數分成R個區。中間結果在本地硬盤的位置信息將發送回Master,然后Master負責把這些位置信息傳送給Reduce Worker。

 

當 Master通知執行Reduce的Worker關于中間<key,value>對的位置信息時,它條用遠程過程,從Map Worker的本地硬盤上讀取緩沖的中間數據。當Reduce Worker讀到所有的中間數據,它就使用中間key進行排序,這樣可使相同的key的值都在一起。因為有許多不用的key的Map都對用相同的 Reduce任務,所以排序是必須的。如果中間結果集過于龐大,那么就需要使用外排序。

 

Reduce Worker根據每一個唯一中間的key來遍歷所有排序后的中間數據,并且把key和相關的中間結果值集合傳遞給用戶定義的Reduce函數。Reduce函數的結果寫到最終的一個輸出文件。

 

當所有的Map任務和Reduce任務都完成的時候,Master激活用戶程序。此時MapReduce返回用戶程序的調用點。

注:MapReduce通過重新執行失效的地方來實現容錯。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!