MapReduce的Shuffle原理

什麼是Shuffle

Hadoop計算框架Shuffler, 在mapper和reducer中間的一個步驟 ,可以把mapper的輸出按照某種key值重新切分和組合成n份,把key值符 合某種範圍的輸出送到特定的reducer那裏去處理

Shuffle的原理分析

這裏寫圖片描述

運行步驟如下:
step1:map端調用context.write(),先將數據寫到map的緩衝區中,當緩衝區的填充比達到一個閾值的時候,系統中會開啓一個後臺線程spill,負責將數據寫入到磁盤,這個過程稱爲溢出,每次溢出的時候,溢出的數據會寫入到mapreduce.cluster.local.dir目錄下的一個文件中
step2:在spill溢出的時候,就會調用Partitioner和Sort,都是根據KV的key進行分組和排序的,並且如果定義了Combiner那麼Combiner還會執行
step3:在一次map過程中,會產生多個溢出文件,當map最終完成的時候,在本地的磁盤上可能會存在多個有分區編號的溢出文件,這些文件最終會被合併成一個排好序的含有分區編號的文件。在這裏需要注意的是,在最終生成的文件之前也會執行Combiner
step4:reduce會使用HTTP協議從Mapper節點獲得屬於自己的劃分,每個Reduce默認會使用5個線程從mapper節點獲取數據

詳細解析:
step1中緩衝區填充比的閾值是由mapreduce.map.sort.spill.percent定義的,默認值0.8,緩衝區的大小mapreduce.task.io.sort.mb其默認大小是512MB,緩衝區的大小會影響到排序的效率,一般來說,緩衝區越大,排序的效率越大,但是內存是有限的,增大緩衝區的大小會影響到每個節點能運行的maptask的數量

step4中reduce怎麼會知道自己的劃分呢?每個map實例完成後,其會通知ApplicationMaster其運行過程中產生的劃分,每個reduce會一直定期的查詢AM,直到reduce獲得最後一個託管其分區的節點,當map實例完成的個數超過mapreduce.job.reduce.slowstart.completedmaps規定的值之後,reduce階段就會執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章