Shuffle的洗牌過程

Shuffle的正常意思是洗牌或弄亂數組

 

 

 

 

 

Shuffle描述着數據從map task輸出到reduce task輸入的這段過程。.app

 

大部分map task與reduce task的執行是在不一樣的節點上。固然不少狀況下Reduce執行時須要跨節點去拉取其它節點上的map task結果。優化

 

咱們對Shuffle過程的指望能夠有:spa

完整地從map task端拉取數據到reduce 端。在跨節點拉取數據時,儘量減小對帶寬的沒必要要消耗。減小磁盤IO對task執行的影響。線程

 

 

 

Shuffle解釋排序

每一個map task都有一個內存緩衝區,存儲着map的輸出結果,當緩衝區快滿的時候須要將緩衝區的數據以一個臨時文件的方式存放到磁盤,當整個map task結束後再對磁盤中這個map task產生的全部臨時文件作合併,生成最終的正式輸出文件,而後等待reduce task來拉數據。索引

 

一、在map task執行時,它的輸入數據來源於HDFS的block,固然在MapReduce概念中,map task只讀取split。Split與block的對應關係多是多對一,默認是一對一。接口

 

二、在通過mapper的運行後,咱們得知mapper的輸出是這樣一個k/v鍵值進程

。在這隻作統計,reduce才作合併。內存

 

3.Partitioner接口,它的做用就是根據key或value及reduce的數量來決定當前的這對輸出數據最終應該交由哪一個reduce task處理。默認對key hash後再以reduce task數量取模。默認的取模方式只是爲了平均reduce的處理能力,若是用戶本身對Partitioner有需求,能夠訂製並設置到job.set(..)

 

4(Memory Buffer)接下來咱們將數據寫入到內存緩衝區中,緩衝區的做用是批量收集map結果,減小磁盤IO的影響。咱們的key/value對以及Partition的結果都會被寫入緩衝區。固然寫入以前,key與value值都會被序列化成字節數組。

 

5內存緩衝區是有大小限制的,默認是100MB。map task 的輸出結果大於這個內存緩衝區的閥值是(buffer size * spill percent = 100MB * 0.8 = 80MB

溢寫線程啓動,把這80M在緩衝區的數據寫入到磁盤中,Map task向剩下20MB在內存中,互補影響。這個從內存往磁盤寫數據的過程被稱爲Spill

 

 

當溢寫線程啓動後,須要對這80MB空間內的key作排序(Sort)。排序是MapReduce模型默認的行爲,這裏的排序也是對序列化的字節作的排序。

 

圖上也能夠看到寫到磁盤中的溢寫文件是對不一樣的reduce端的數值作過合併。因此溢寫過程一個很重要的細節在於,若是有不少個key/value 對須要發送到某個reduce端去,那麼須要將這些key/value值拼接到一塊,減小與partition相關的索引記錄。

 

6.若是client設置過Combiner,那麼如今就是使用Combiner的時候了。將有相同key的key/value對的value加起來,減小溢 寫到磁盤的數據量。Combiner會優化MapReduce的中間結果,因此它在整個模型中會屢次使用。那哪些場景才能使用Combiner呢?從這裏 分析,Combiner的輸出是Reducer的輸入,Combiner毫不能改變最終的計算結果。因此從個人想法來看,Combiner只應該用於那種 Reduce的輸入key/value與輸出key/value類型徹底一致,且不影響最終結果的場景。好比累加,最大值等。Combiner的使用必定 得慎重,若是用好,它對job執行效率有幫助,反之會影響reduce的最終結果。

 

7.每次溢寫會在磁盤上產生一個溢寫文件,Map 輸出結果很大時,會有屢次這樣的溢寫文件到磁盤上,當 Map task 結束完成時,內存緩衝區的數據一樣也會溢寫到磁盤上,結果磁盤會有一個或多個溢出的文件,同時合併溢出的文件。(若是map輸出的結果不多,map完成時,溢出的文件只有一個)合併這個過程就叫作Merge{墨跡}

 

merge是將多個溢寫文件合併到一個文件,因此可能也有相同的key存在,在這個過程當中若是client設置過Combiner,也會使用Combiner來合併相同的key。

 

此時,map端的工做都已結束,最終生成的文件也存放在Task Tracker本地目錄內,每一個reduce task 不斷的經過RPC 從JOBTracker哪裏獲取 map task 是否完成,若是reduce task 獲得通知,通知到某臺Task Tracker 上的map task執行完成,shuffle的reducece開始拉去map Task完成的數據

 

 

Reducer真正運行以前,全部的時間都是在拉取數據,作merge,且不斷重複地在作。如前面的方式同樣,分段地描述reduce 端的Shuffle細節

 

1.copy 過程,就是拉取數據。Reduce進程啓動一些copy線程,經過Http方式請求 map task 所在的TaskTracker獲取map task的輸出文件。應爲map task 已經結束,這文件就歸TaskTracker管理了,管理在本地磁盤中。

 

2.copy過來的數據會先儲存在內存緩衝區中(Memory Buffer),這裏的緩衝區要比map端的更加靈活,它基於JVM的heap size 的設置,由於shuffle階段rduce不運行,因此把大部分的內存給shuffle來用,

這裏和map中內存溢出同樣,當內存中的數據達到必定的閥值,就會啓動內存到磁盤的溢出....合併Merge   。這個過程咱們設置Combiner,也會啓用的,而後在磁盤中生成不少一些文件。值到map端沒有數據才結束。而後啓動第三種磁盤到磁盤的merge方式生成最終的那個文件。

 

3.Reduce的輸入文件,不斷的合併後(merge),最後會生成一個「最終文件」,這個文件可能存在磁盤上也能在內存中(內存須要設置而且優化),默認在磁盤中,當Reducer的輸入文件已定,整個Shuffle才最終結束。而後就是Reducer執行,把結果放到HDFS上。

相關文章
相關標籤/搜索