精美網(wǎng)頁設(shè)計(jì)源碼網(wǎng)站seo優(yōu)化外包顧問
文章目錄
- (95) Shuffle機(jī)制
- 什么是shuffle?
- Map階段
- Reduce階段
- 參考文獻(xiàn)
(95) Shuffle機(jī)制
面試的重點(diǎn)
什么是shuffle?
Map方法之后,Reduce方法之前的這段數(shù)據(jù)處理過程,就叫做shuffle,中文直譯"洗牌"。
參考上一小節(jié)的MR工作流程,整個(gè)shuffle的工作流程如下圖,可以理解成shuffle橫跨map和reduce階段:
Map階段
1) Map()處理之后的數(shù)據(jù),會(huì)被傳輸進(jìn)環(huán)形緩沖區(qū),而在這個(gè)過程中,數(shù)據(jù)會(huì)被打上一個(gè)"分區(qū)",之后會(huì)講這個(gè)分區(qū)是怎么來的。打好分區(qū)后,數(shù)據(jù)會(huì)被正式寫入環(huán)形緩沖區(qū)。
2) 環(huán)形緩沖區(qū)的機(jī)制在上一小節(jié)里有介紹,看那個(gè)就行。需要注意,它在溢寫到磁盤之前,需要對(duì)數(shù)據(jù)進(jìn)行排序,即針對(duì)KEY值的索引,按照字典順序進(jìn)行快排。
每次溢寫后會(huì)形成兩個(gè)文件,一個(gè)是保存索引用的spill.index,一個(gè)是保存數(shù)據(jù)用的spill.out。這個(gè)過程中有一個(gè)可選環(huán)節(jié),即combiner
,即簡單聚合,如果開啟這個(gè)環(huán)節(jié)的話,會(huì)對(duì)本次溢寫的文件做一些簡單的預(yù)聚合,如將<a,1>, <a,1>
合并成<a,2>
,從而在一定程度上減輕reduce階段的輸入量。
3) 溢寫會(huì)進(jìn)行很多輪,即生成很多個(gè).out文件。 當(dāng)輸入數(shù)據(jù)全部溢寫完成后,會(huì)以分區(qū)為單位,對(duì)所有溢寫結(jié)果做歸并排序,并最終整合成一個(gè)大文件。相當(dāng)于是在該MapTask下,最終只保留一個(gè)文件,且這個(gè)文件內(nèi)部是按照分區(qū)由低到高排列,分區(qū)內(nèi)部有序。
4) 歸并排序后,仍然是一個(gè)可選的combiner
環(huán)節(jié),對(duì)文件內(nèi)數(shù)據(jù)做再次的預(yù)聚合。
5) combiner之后,會(huì)對(duì)各分區(qū)的數(shù)據(jù)文件做壓縮。從歸并排序到壓縮,這部分工作都是在內(nèi)存中完成的,最后會(huì)將壓縮后的數(shù)據(jù)寫入磁盤。
為什么要進(jìn)行壓縮呢?
這是一個(gè)優(yōu)化的手段,因?yàn)樽罱K的輸出是要傳到Reduce里的,待傳輸?shù)奈募叫?#xff0c;輸出的時(shí)間就越短,相比就更加高效。這個(gè)后面具體會(huì)講
6) 最后,會(huì)將壓縮后的文件放進(jìn)磁盤中,等待Reduce來主動(dòng)拉取。
Reduce階段
在Reduce階段
1) 每個(gè)ReduceTask會(huì)主動(dòng)拉取Map階段的處理結(jié)果(指定分區(qū)),優(yōu)先讀取到內(nèi)存,因?yàn)閮?nèi)存里面直接處理會(huì)更快,但是如果內(nèi)存不夠那就沒辦法了,只能溢寫到磁盤,后續(xù)一點(diǎn)點(diǎn)處理了。
2) 然后對(duì)從每個(gè)MapTask收上來的數(shù)據(jù),做歸并排序。
3) 歸并排序完之后,再根據(jù)相同的key進(jìn)行分組,分組之后的數(shù)據(jù)類似于如<key, [v1, v2, v3,...]>
。
4) 最終,把分組后的數(shù)據(jù)送進(jìn)Reduce(),做相應(yīng)的業(yè)務(wù)邏輯處理,并輸出。
以上流程,就是一個(gè)完整的shuffle流程。
參考文獻(xiàn)
- 【尚硅谷大數(shù)據(jù)Hadoop教程,hadoop3.x搭建到集群調(diào)優(yōu),百萬播放】