shuffle:系統(tǒng)執(zhí)行排序错负,將map輸出作為輸入傳給reduce的過程稱為shuffle剖笙。mapreduce確保每個reduce的輸入都是按鍵排序的臭蚁。
map端
每個map都有一個緩沖區(qū)用于任務(wù)輸出邮偎,當(dāng)?shù)竭_(dá)閥值(默認(rèn)80%)會寫到溢出文件里瞧捌,最終寫到一個磁盤里棵里,在寫磁盤前會根據(jù)最終的reduce將數(shù)據(jù)分區(qū)排序,排序后運(yùn)行combiner函數(shù)使寫到磁盤的數(shù)據(jù)更緊湊從而減少寫的數(shù)據(jù)量和傳輸?shù)絩educe的數(shù)據(jù)量姐呐。
還可以對map的輸出進(jìn)行壓縮殿怜,執(zhí)行參數(shù)mapreduce.map.output.compress即可,這樣可以使磁盤寫入速度變快曙砂,節(jié)省磁盤空間头谜。
sethive.exec.compress.intermediate=true;?開啟hive中間傳輸數(shù)據(jù)壓縮功能
reducer通過HTTP得到輸出文件的分區(qū)
reduce端
map的輸出文件位于tasktracker本地磁盤。
首先使reduce的復(fù)制階段鸠澈,在每個任務(wù)完成時柱告,reduce任務(wù)就開始復(fù)制map的輸出。如果map的輸出很小則輸出到reduce的內(nèi)存笑陈,否則還是會輸出到磁盤上际度。隨著后臺文件增多,后臺線程會合并為更大的涵妥,排好序的文件乖菱,為后續(xù)reduce的合并節(jié)省時間。
然后是排序階段蓬网。這個階段合并map的文件窒所,合并的文件數(shù)目由參數(shù)mapreduce.task.io.sort.factor執(zhí)行,默認(rèn)為10.
最后是reduce階段帆锋,將所有的文件合并墩新,之前的合并只是為了滿足這個階段的合并系數(shù)。然后輸出到文件系統(tǒng)
set mapreduce.output.fileoutputformat.compress=true;?開啟mapreduce最終輸出數(shù)據(jù)壓縮
配置調(diào)優(yōu)
總的原則是shuffle過程由足夠的內(nèi)存空間窟坐。
map端
可以通過避免多次溢出磁盤來獲取最佳性能,所以可以優(yōu)先考慮設(shè)置參數(shù)mapreduce.task.io.sort.mb绵疲,這個參數(shù)是排序map所用的緩沖區(qū)的大小哲鸳,單位是m
reduce端
如果reduce函數(shù)內(nèi)存要求不大,主要設(shè)置
mapreduce.reduce.merge.inmem.threshold = 0?
mapreduce.reduce.input.buffer.percent 小于1.0 為了減少訪問磁盤次數(shù)