1. 程式人生 > >Mapreduce過程的理解

Mapreduce過程的理解

本文章僅僅圍繞上面的圖解進行講解,本文對網上的一些講解進行一次彙總。希望可以幫到剛學習Hadoop的mapreduce的人。

對於一個mapreduce任務,可以有多個map和reduce。對於每個mapper,都會有對應的輸入,如圖中所示的input split(切片)。對於每個切片,要弄清楚這概念首先要明白hadoop的HDFS的原理,這裡不過多個講解,後面我會進行補充。從淺層的方面上,我們可以簡單的理解成,我們要處理的文字資料經過inputFormat進行處理,預設情況下是 TextInputFormat,可以在配置啟動中修改這一值,改變輸入時的格式資訊。

對於每個切片資料,都會經過map程式,對於這一指令碼可以用多種語言進行編寫,主要是用java或者python,不過喜歡C/C++的朋友,可以用自己喜歡的語言,至於如何使用具體請用檢索系統進行搜尋。我主要是用Python進行編寫(公司主要是用python進行編寫)。對於mapper的輸出主要的格式要和reducer的輸入的格式進行匹配。對於每個mapper處理完成後,都將資料資訊寫到快取中,快取滿了,就會將資料寫到硬盤裡。對於這一快取的空間大小可以進行設定,其中佔滿了多少回啟動寫到硬碟中,都有一個比例的設定。在中間這一shuffle過程中會經過排序等規則,排序預設情況下會使用key的hash對映進行排序,當然這個過程可以進行重寫。每個combine可以的處理可以簡單的理解為一個小型的reducer,這一塊我不常用。主要是以前學習時上網搜尋的。可以理解為達到區域性資料的一個結果。就像歸併排序一樣,兩個區域性有序的部分進行歸併時,時間複雜度O(m+n),算是一個線性的了。同樣的道理,兩個區域性有序的部分,partition進行分配到reducer時,每個reducer處理的分段時區域性有序,可以降低處理的時間。具體的情況具體分析。在reduce階段,對於所分配而來的資料首先會進行merge。所得到的資料輸入到reducer中進行處理。

reducer的處理結果也會有對應的快取輸出。對於處理的結果,最後可以通過outputFormat進行制定其中的輸出格式。對於輸出的位置一般是HDFS上。注意在HDFS上的檔案是不能被修改的,所以當已有一個檔案時,則啟動程式是會失敗的。

學習的不深入,若其中有紕漏的地方,望指正!