本文是學習時的自我總結,用於日後溫習。如有錯誤還望諒解,不吝賜教。 此處附上一篇個人認為寫的比較好的博客,轉自枝葉飛揚的博文:http://blog.sina.com.cn/s/blog_605f5b4f010188lp.html### 將Map的輸出作為Reduce的輸入的過程就是Shuffle了 ...
本文是學習時的自我總結,用於日後溫習。如有錯誤還望諒解,不吝賜教。
此處附上一篇個人認為寫的比較好的博客,轉自枝葉飛揚的博文:http://blog.sina.com.cn/s/blog_605f5b4f010188lp.html###
將Map的輸出作為Reduce的輸入的過程就是Shuffle了,這個是MapReduce優化的重點地方
Shuffle 過程
① Map在記憶體中開啟一個預設大小100MB的環形記憶體緩衝區用於輸出
② 當緩衝區記憶體達到預設閾值 80% 時,Map 會啟動守護進程,把內容寫到磁碟上,這個過程叫做Spill。另外的20% 記憶體可繼續寫入數據,寫入磁碟和寫入記憶體互不幹擾
③ 如果緩存區被撐滿,Map 會阻塞寫入記憶體的操作,在寫入磁碟操作完成後再繼續寫入記憶體
④ 排序階段是在寫入磁碟的時候進行的,如果有Combiner,排序前會執行Combiner
⑤ 每次Spill寫入磁碟操作會產生溢出文件,當Map輸出全部完成後,Map會合併這些文件
此處的小文件合併,是對於不同分區進行小文件合併,即同一個Map輸出的所有小文件應該根據分區進行文件合併
⑥ Reduce階段中,一個Partition對應一個Reduce作業,Reduce會根據Partition找到對應的map輸出文件,進行複製操作,複製過程中Reduce會進行排序操作和合併文件操作
Shuffle 優化
① 分區:預設哈希演算法分區,滿足不了業務需求時需要按業務要求重寫
public int getPartition(K key, V value, int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; }
② 分組:預設相同的Key在一組,如果業務要求某些不同的Key按一組來調用一次reduce(),這時需要重寫
③ 排序:預設按字典排序,如果業務上要求不是這樣,比如要求降序或者按其它條件來排,需要重寫