歡迎來到魔據教育大數據學院,專注大數據工程師培養!
當前位置:首頁 > 學習資料 > 講師博文 > MapReduce的核心Shuffle

MapReduce的核心Shuffle

時間:2017-08-17 17:51:18作者:[!--zuozhe--]

 

一、什么是Shuffle
Shuffle過程是MapReduce的核心,也被稱為奇跡發生的地方。Shuffle的正常意思是洗牌或弄亂

8-1.png

 

在Hadoop這樣的集群環境中,大部分map task與reduce task的執行是在不同的節點上。Reduce執行時需要跨節點去拉取其它節點上的map task結果。如果集群正在運行的job有很多,那么task的正常執行對集群內部的網絡資源消耗會很嚴重。這種網絡消耗是正常的,我們不能限制,能做的就是最大化地減少不必要的消耗。還有在節點內,相比于內存,磁盤IO對job完成時間的影響也是可觀的。從最基本的要求來說,我們對Shuffle過程的期望可以有: 
Ø 完整地從map task端拉取數據到reduce 端。
Ø 在跨節點拉取數據時,盡可能地減少對帶寬的不必要消耗。
Ø 減少磁盤IO對task執行的影響。
、Shuffle在map端的過程
1.在map task執行時,它的輸入數據來源于HDFS的block,當然在MapReduce概念中,map task只讀取split。Split與block的對應關系可能是多對一,默認是一對一。
2.在經過mapper的運行后,mapper的輸出是一個key/value對: key是單詞, value是數值1。job有多個reduce task,到底當前的結果應該交由哪個reduce去做呢?
MapReduce提供Partitioner接口,它的作用就是根據key或value及reduce的數量來決定當前的這對輸出數據最終應該交由哪個reduce task處理。默認對key hash后再以reduce task數量取模。默認的取模方式只是為了平均reduce的處理能力,如果用戶自己對Partitioner有需求,可以訂制并設置到job上。 
3.這個環形緩沖區默認是100MB。當map task的輸出結果很多時,就可能會撐爆內存,所以需要將緩沖區中的數據臨時寫入磁盤,然后重新利用這塊緩沖區。這個從內存往磁盤寫數據的過程被稱為Spill,中文可譯為溢寫,整個緩沖區有個溢寫的比例spill.percent。這個比例默認是0.8,也就是當緩沖區的數據已經達到閾值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢寫線程啟動,鎖定這80MB的內存,執行溢寫過程。Map task的輸出結果還可以往剩下的20MB內存中寫,互不影響。 
當溢寫線程啟動后,需要對這80MB空間內的key做排序(Sort)。排序是MapReduce模型默認的行為,這里的排序也是對序列化的字節做的排序
溢寫過程一個很重要的細節在于,如果有很多個key/value對需要發送到某個reduce端去,那么需要將這些key/value值拼接到一塊,減少與partition相關的索引記錄。 
  在針對每個reduce端合并數據時,如果在同一個map task的結果中有很多個出現多次的key,我們就把它們的值合并到一塊,這個過程叫reduce也叫combine。reduce只指reduce端執行從多個map task取數據做計算的過程。非正式地合并數據只能算做combine了
如果client設置過Combiner,Combiner會優化MapReduce的中間結果 Combiner的輸出是Reducer的輸入,Combiner絕不能改變最終的計算結果。所以Combiner只應該用于Reduce的輸入與輸出類型完全一致,且不影響最終結果的場景。比如累加,最大值等。
4.每次溢寫會在磁盤上生成一個溢寫文件,如果map的輸出結果很大,有多次這樣的溢寫發生,磁盤上相應的就會有多個溢寫文件存在。當map task真正完成時,內存緩沖區中的數據也全部溢寫到磁盤中形成一個溢寫文件。最終磁盤中會至少有一個這樣的溢寫文件存在(如果map的輸出結果很少,當map執行完成時,只會產生一個溢寫文件),因為最終的文件只有一個,所以需要將這些溢寫文件歸并到一起,這個過程就叫做Merge。比如{“aaa”, [5, 8, 2, …]},數組中的值就是從不同溢寫文件中讀取出來的,然后再把這些值加起來。在這個過程中如果client設置過Combiner,也會使用Combiner來合并相同的key。 
最終生成的文件存放在TaskTracker夠得著的某個本地目錄內。每個reduce task不斷地通過RPC從JobTracker那里獲取map task是否完成的信息,如果reduce task得到通知,獲知某臺TaskTracker上的map task執行完成,Shuffle的后半段過程開始啟動。 
簡單地說,reduce task在執行之前的工作就是不斷地拉取當前job里每個map task的最終結果,然后對從不同地方拉取過來的數據不斷地做merge,也最終形成一個文件作為reduce task的輸入文件。見下圖:

8-2.png

三、Shuffle在reduce端的過程
 1.Copy過程,簡單地拉取數據。Reduce進程啟動一些數據copy線程(Fetcher),通過HTTP方式請求map task所在的TaskTracker獲取map task的輸出文件。因為map task早已結束,這些文件就歸TaskTracker管理在本地磁盤中。 
2.Merge階段。Copy過來的數據會先放入內存緩沖區中,這里的緩沖區大小要比map端的更為靈活,它基于JVM的heap size設置,因為Shuffle階段Reducer不運行,所以應該把絕大部分的內存都給Shuffle用。這里需要強調的是,merge有三種形式:
1)內存到內存 
2)內存到磁盤 
3)磁盤到磁盤
默認情況下第一種形式不啟用。當內存中的數據量到達一定閾值,就啟動內存到磁盤的merge。與map 端類似,這也是溢寫的過程,這個過程中如果你設置有Combiner,也是會啟用的,然后在磁盤中生成了眾多的溢寫文件。第二種merge方式一直在運行,直到沒有map端的數據時才結束,然后啟動第三種磁盤到磁盤的merge方式生成最終的那個文件。 
3.Reducer的輸入文件。不斷地merge后,會生成一個最終文件。這個文件可能存在于磁盤上,也可能存在于內存中。默認情況下,這個文件是存放于磁盤中的。當Reducer的輸入文件已定,整個Shuffle才最終結束。然后就是Reducer執行,把結果放到HDFS上。

更多大數據相關資訊敬請關注魔據教育,為您分享最及時的大數據資訊。
學習大數據敬請關注魔據教育微信二維碼。
魔據教育微信二維碼

【版權與免責聲明】如發現內容存在版權問題,煩請提供相關信息發郵件至[email protected],我們將及時溝通與處理。本站內容除非來源注明魔據教育,否則均為網友轉載,涉及言論、版權與本站無關。

全國咨詢熱線:18501996998,值班手機:18501996998(7*24小時)

在線咨詢:張老師QQ 320169340

企業合作服務專線:010-82340234-821, 院校合作洽談專線:010-82340234

Copyright 2001-2019 魔據教育 - 北京華育興業科技有限公司 版權所有,京ICP備17018991號-2

免費在線咨詢立即咨詢

免費索取技術資料立即索取

大數據技術交流QQ:226594285

電話咨詢010-82340234

六合图库118万众图库