1、用於map的輸入,先將輸入資料切分成相等的分片,為每一個分片建立一個map worker,這裡的切片大小不是隨意訂的,一般是與HDFS塊大小一致,預設是64MB,一個節點上儲存輸入資料切片的最大size就是HDFS的塊大小,當設定的切片size大於HDFS塊大小,會引起節點之間的傳輸,佔用頻寬。
2、map worker呼叫使用者編寫的map函式對每個分片進行處理,並且將處理結果輸出到本地儲存(非HDFS)
3、對map的輸出進行combiner操作,這裡的的combiner主要是減少map與reduce之間的資料傳輸量,不是必須的步驟,可以例舉一個《hadoop: the definitive guide》中的例子求最大溫度的處理。
Fir Map Output:
(1950, 0)
(1950, 20)
(1950, 10)
Sec Map Output:
(1950, 25)
(1950, 15)
在不呼叫combiner的情況下,是將map的輸出資料都將傳送到reduce那裡,在reduce處理時,將會將如下資料作為輸入:
(1950, [0, 20, 10, 25, 15])
在呼叫combiner的情況下,現在每個map本地對輸出資料進行處理(即將當前的map的最大溫度求出),然後再傳輸給reduce,如下:
Fir Map Combined:
(1950, 20)
Sec Map Combined:
(1950, 25)
而此時reduce將會用如下資料作為輸入,從而map與reduce之間的資料傳輸量得到降低:
(1950, [20, 25])
4、將combiner處理後的資料或者map的輸出資料進行shuffle處理,所謂的shuffle處理是將資料中的記錄通過partition操作對映到reduce中,從而保證每個reduce處理的是相同key的記錄。注意partition函式可以進行自定義,也可以使用預設的partition函式,預設的partition是利用一個hash對映操作將相同key的記錄對映到相同的reduce.
5、reduce呼叫使用者定義的reduce函式對資料進行處理,輸出存入HDFS。