宏觀上MapReduce可以分為以下三個階段,如下圖1所示。
階段1:input/map/partition/sort/spill
階段2:mapper端merge
階段3:reducer端merge/reduce/output
圖1 MapReduce執行過程
以下分別對上述三個階段詳解。首先是Mapper端的執行邏輯,主要包含以下三點,如圖2所示:
1. 將key/value/Partition寫入到內存緩沖區中
2. 當緩沖區使用量達到一定閥值,將其spill到disk上,spill前,需要進行排序
3. 排序時先按照Partition進行排序,再按照key進行排序,默認排序算法是快速排序。
注意: 在內存中進行排序時,數據本身不用移動,僅對索引排序即可
圖2 Mapper端邏輯
接下來是Map端的歸並實現,主要包含以下兩點,如圖3所示。
1.對生成的多個spill文件,進行歸並排序
2.最終歸並成一個大文件
注意:
1. 由於每一個spill文件都是按分區和key排序好的,所以歸並完的文件也是按分區和key排序好的。
2.在進行歸並的時候,不是一次性的把所有的spill文件歸並成一個大文件。而是部分spill文件歸並成中間文件,然后中間文件和剩下的spill文件再進行歸並。
圖3 Map端Merge
最后是Reducer端的Merge和Reduce,主要包含以下三點,如圖4所示:
1. 當有新的MapTask事件完成時,拷貝線程從指定的機器上面拷貝數據
2. 當數據拷貝的時候,分兩種情況,當數據量小的時候就會寫入內存當中,當數據量大的時候就會寫入硬盤當中
3. 來自不同的機器的多個數據文件,需要歸並成一個文件.在拷貝文件過程中會進行文件歸並操作.
圖4 Reducer端Merge和Reduce
轉載請注明出處。