在MapReduce整個過程可以概括為以下過程:
輸入 --> map --> shuffle --> reduce -->輸出
輸入文件會被切分成多個塊,每一塊都有一個map task
map階段的輸出結果會先寫到內存緩沖區,然后由緩沖區寫到磁盤上。默認的緩沖區大小是100M,溢出的百分比是0.8,也就是說當緩沖區中達到80M的時候就會往磁盤上寫。如果map計算完成后的中間結果沒有達到80M,最終也是要寫到磁盤上的,因為它最終還是要形成文件。那么,在往磁盤上寫的時候會進行分區和排序。一個map的輸出可能有多個這個的文件,這些文件最終會合並成一個,這就是這個map的輸出文件。
流程說明如下:
1、輸入文件分片,每一片都由一個MapTask來處理
2、Map輸出的中間結果會先放在內存緩沖區中,這個緩沖區的大小默認是100M,當緩沖區中的內容達到80%時(80M)會將緩沖區的內容寫到磁盤上。也就是說,一個map會輸出一個或者多個這樣的文件,如果一個map輸出的全部內容沒有超過限制,那么最終也會發生這個寫磁盤的操作,只不過是寫幾次的問題。
3、從緩沖區寫到磁盤的時候,會進行分區並排序,分區指的是某個key應該進入到哪個分區,同一分區中的key會進行排序,如果定義了Combiner的話,也會進行combine操作
4、如果一個map產生的中間結果存放到多個文件,那么這些文件最終會合並成一個文件,這個合並過程不會改變分區數量,只會減少文件數量。例如,假設分了3個區,4個文件,那么最終會合並成1個文件,3個區
5、以上只是一個map的輸出,接下來進入reduce階段
6、每個reducer對應一個ReduceTask,在真正開始reduce之前,先要從分區中抓取數據
7、相同的分區的數據會進入同一個reduce。這一步中會從所有map輸出中抓取某一分區的數據,在抓取的過程中伴隨着排序、合並。
8、reduce輸出