在MapReduce執(zhí)行的過程中陈惰,會(huì)把任務(wù)的原始數(shù)據(jù)分片到多個(gè)Task中執(zhí)行北专。想象以下場(chǎng)景禀挫,當(dāng)任務(wù)的多數(shù)Task都在短時(shí)間內(nèi)完成,只有個(gè)別Task執(zhí)行的時(shí)間特別長(zhǎng)拓颓,從而拖慢了整個(gè)任務(wù)的執(zhí)行速度语婴,浪費(fèi)了資源。表現(xiàn)形式就是任務(wù)進(jìn)度卡在99%驶睦,這種現(xiàn)象就是數(shù)據(jù)傾斜砰左。
MapReduce流程:
① 文件分片,一個(gè)分片交由一個(gè)map task執(zhí)行
② map task首先把數(shù)據(jù)從磁盤讀入內(nèi)存環(huán)形緩沖區(qū)场航,在緩沖區(qū)快滿時(shí)觸發(fā)spil缠导,將數(shù)據(jù)溢寫到磁盤多個(gè)文件中,默認(rèn)根據(jù)key的hash值進(jìn)行分區(qū)溉痢,寫入每個(gè)文件前會(huì)進(jìn)行排序僻造。
③ map端會(huì)進(jìn)行部分聚合操作憋他,減少數(shù)據(jù)傳輸中的網(wǎng)絡(luò)消耗
④ reduce節(jié)點(diǎn)從不同map節(jié)點(diǎn)拉取自己需要處理的數(shù)據(jù)
⑤ 在ruduce節(jié)點(diǎn)上把文件合并成一個(gè)輸入reduce task,執(zhí)行任務(wù)
Map傾斜:
1)導(dǎo)致map端數(shù)據(jù)傾斜的原因:
① 輸入文件小文件過多嫡意,導(dǎo)致數(shù)據(jù)分布不均勻举瑰,從而產(chǎn)生數(shù)據(jù)傾斜
② map task做聚合時(shí),某個(gè)key特別多蔬螟,從而產(chǎn)生數(shù)據(jù)傾斜
2)解決map端數(shù)據(jù)傾斜方案:
針對(duì)情況①此迅,首先上游對(duì)文件進(jìn)行合并,然后通過配置參數(shù)修改map task個(gè)數(shù)旧巾、每個(gè)map task處理的數(shù)據(jù)量耸序。
針對(duì)情況②,使用distribute by rand()將map端分發(fā)的數(shù)據(jù)重新按照隨機(jī)值進(jìn)行一次再分發(fā)鲁猩,使得map task的輸入數(shù)據(jù)分布更加均勻
3)解決map端數(shù)據(jù)傾斜核心:
① 讓map task輸入數(shù)據(jù)分布均勻
② 查找導(dǎo)致map變慢的操作
③ 考慮這些操作是否必須發(fā)生再map階段
Join傾斜:
1)join數(shù)據(jù)傾斜的場(chǎng)景:
① join的兩張表坎怪,其中有一張數(shù)據(jù)量很小
② join的兩張表數(shù)據(jù)量都很大,表中存在大量空值
③ join的兩張表數(shù)據(jù)量都很大廓握,由于數(shù)據(jù)本身分布不均勻?qū)е聝A斜
2)join數(shù)據(jù)傾斜解決方案
針對(duì)場(chǎng)景①搅窿,使用mapjoin的方式,mapjoin的原理是把小表存入每一個(gè)map節(jié)點(diǎn)的內(nèi)存中隙券,順序掃描另一張表在map端完成join男应,避免因分發(fā)key不均勻而導(dǎo)致的數(shù)據(jù)傾斜。
針對(duì)場(chǎng)景②娱仔,表中的空值聚合導(dǎo)致數(shù)據(jù)傾斜沐飘,可以使用coalesce(列,隨機(jī)值)將空值處理成隨機(jī)值牲迫,因?yàn)榭罩店P(guān)聯(lián)不上所以處理成隨機(jī)值不會(huì)影響結(jié)果
針對(duì)場(chǎng)景③耐朴,數(shù)據(jù)傾斜是由熱點(diǎn)數(shù)據(jù)導(dǎo)致,首先將熱點(diǎn)數(shù)據(jù)和非熱點(diǎn)數(shù)據(jù)分別處理盹憎,非熱點(diǎn)數(shù)據(jù)正常join筛峭,對(duì)于熱點(diǎn)數(shù)據(jù)根據(jù)情況特殊處理(核心思想是平均數(shù)據(jù)量),最后把兩部分?jǐn)?shù)據(jù)聯(lián)合在一起