分布式數據處理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通過重新執行失效的地方來實現容錯。