數(shù)據(jù)傾斜解決思路詳解

數(shù)據(jù)傾斜是由于某個(gè)task被分配過多數(shù)據(jù)斜做,而比其他task需要更多的執(zhí)行時(shí)間(如幾十倍臀叙,幾百倍),導(dǎo)致其他task執(zhí)行完進(jìn)入漫長等待的一種現(xiàn)象锅纺。

數(shù)據(jù)傾斜只會(huì)發(fā)生在多對多或一對多的數(shù)據(jù)分發(fā)的過程中攀涵,如spakr的shuffle操作中铣耘,在MapReduce中的reduce階段,

常見的算子類型為:join以故,group by 和窗口函數(shù)如row_number 蜗细。

這是因?yàn)檫@些算子會(huì)進(jìn)行shuffle操作,產(chǎn)生一個(gè)key值怒详,如group by的字段炉媒,join的on字段,

為了利用多臺(tái)機(jī)器的并發(fā)能力昆烁,會(huì)按這個(gè)key值取數(shù)范圍進(jìn)行均衡的分發(fā)吊骤,每臺(tái)機(jī)器盡量分到相同長度的取值范圍的key,

然后將這些有key值的數(shù)據(jù)的數(shù)據(jù)傳輸過去静尼。

這時(shí)如果某個(gè)key范圍內(nèi)的數(shù)據(jù)量大大多于其他范圍的數(shù)據(jù)量白粉,就會(huì)發(fā)生數(shù)據(jù)傾斜。

解決辦法:

解決數(shù)據(jù)傾斜的思路在于鼠渺,先找到產(chǎn)生數(shù)據(jù)傾斜的算子操作鸭巴,然后針對具體的算子,解決它單個(gè)key范圍被分到過多的數(shù)據(jù)的問題拦盹,

按key的類型鹃祖,由簡便到復(fù)雜依次有以下幾種解決思路:

1.直接消滅傾斜的key。

2.直接避免shuffle操作普舆,沒有了shuffle操作也就沒有了數(shù)據(jù)傾斜

3.通過增多task的數(shù)量恬口,減小單個(gè)task內(nèi)的數(shù)據(jù)量校读,這個(gè)方法適用于某個(gè)key范圍的數(shù)據(jù)多的情況。

4.通過特殊處理key值祖能,減小單個(gè)task內(nèi)的數(shù)據(jù)量地熄,這個(gè)方法適用于某些特定的key值的數(shù)據(jù)過多的情況


第一個(gè)解決思路比較簡單,找到傾斜的key芯杀,直接過濾掉。就沒有傾斜問題了雅潭。這種操作的適用范圍很窄揭厚。比如一些空字符串,一些缺省值等等扶供,本身在業(yè)務(wù)上能接受它們不參與操作筛圆。

如果發(fā)現(xiàn)造成傾斜的key是這些,就可以直接過濾椿浓,非常簡單粗暴太援,性價(jià)比最高。


如果該key不能被過濾扳碍,就考慮能否將shuffle操作避免掉提岔。

比如join的時(shí)候使用廣播的方式,將其中一張表廣播到所有的機(jī)器節(jié)點(diǎn)上笋敞,這樣一個(gè)shuffle操作就變成了一個(gè)map操作碱蒙。

廣播的方式(map join)適用于join的時(shí)候某一張表的數(shù)據(jù)量比較小的時(shí)候,如果兩張表都很大夯巷,則不適用這種方式赛惩。


如果不能避免shuffle操作也不能過濾傾斜的key值,那么我們就要從key值的類型入手趁餐,如果傾斜的key值是連續(xù)的喷兼,不是由單個(gè)key值引起的,就可以增大task的數(shù)量后雷,

比如季惯,修改shuffle產(chǎn)生的partition參數(shù)為更大,就可以使同一個(gè)范圍內(nèi)的key值分到不同機(jī)器上喷面,

或者使key值重新排列星瘾,倒排或者其他方式,使他們不再連續(xù)惧辈,分配到不同的機(jī)器上琳状,就可以防止傾斜。


上述3個(gè)操作都比較簡單高效盒齿,但是應(yīng)用的場景有限念逞,如果該key不能被過濾困食,也不能避免shuffle,而且是1個(gè)到多個(gè)不連續(xù)的key引起的翎承,就需要做比較復(fù)雜的操作了硕盹。

如果是group by,就可以用兩階段聚合法叨咖,

將group by a 改成 group by a,b? 瘩例,然后再group by a

或者增加一個(gè)隨機(jī)數(shù)x,將a通過concat(x,a)改成b,將group by a 改成 group by b, 然后再聚合一次去掉x后的b甸各,group by substr(b,length(x))?

如果是join操作垛贤,就需要分開join,將傾斜的數(shù)據(jù)和不傾斜的數(shù)據(jù)分成兩部分趣倾。

然后兩站表不傾斜的部分join得到第一張表聘惦。

傾斜的數(shù)據(jù),第一張較大的表:增加一個(gè)隨機(jī)數(shù)1-x儒恋,隨機(jī)數(shù)取決于你想把數(shù)據(jù)切成幾份善绎。

得到 concat(x,a).?

另一張較小的表將每一行復(fù)制到x份(總共增加x-1份),然后按順序標(biāo)上序號(hào)1到x诫尽,如下所示:

源數(shù)據(jù)禀酱,傾斜的key值為a和b,

大表:aaaaa bbbbb?

小表:aaaa bbbb

原來的join最后得到40條數(shù)據(jù). 每個(gè)key分到20條

處理過key的表牧嫉,

大表:1a 2a 2a 1a 2a 1b 2b 3b 3b 2b? (增加一個(gè)隨機(jī)數(shù)前綴1-3)

小表:

1a 2a 3a 1a 2a 3a 1a 2a 3a 1a 2a 3a 這n條數(shù)據(jù)都按順序附加一個(gè)1~x的前綴

1b 2b 3b 1b 2b 3b 1b 2b 3b 1b 2b 3b

生成40條數(shù)據(jù)比勉,每個(gè)key平均分到6.66條.

6.66條的計(jì)算公式是5/3*4,? 5是大表的key的條數(shù),有5個(gè)驹止,增加隨機(jī)數(shù)之后浩聋,被分成了3份,得到了5/3 條臊恋,小表雖然也加了隨機(jī)數(shù)但是復(fù)制了x份衣洁,

所以小表的key還是4個(gè),所以是:5/3*4

最后將傾斜部分的數(shù)據(jù)和不傾斜的部分的數(shù)據(jù)分別join之后再union起來就可以了抖仅。


當(dāng)然坊夫,解決數(shù)據(jù)傾斜的不止這些方法,這些方法只是常用的撤卢,本質(zhì)還是打散集中在某臺(tái)機(jī)器环凿,某個(gè)task的的數(shù)據(jù)量。只要能達(dá)到這個(gè)目的放吩,就可以智听。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子到推,更是在濱河造成了極大的恐慌考赛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莉测,死亡現(xiàn)場離奇詭異颜骤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捣卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門忍抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人董朝,你說我怎么就攤上這事梯找。” “怎么了益涧?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驯鳖。 經(jīng)常有香客問我闲询,道長,這世上最難降的妖魔是什么浅辙? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任扭弧,我火速辦了婚禮,結(jié)果婚禮上记舆,老公的妹妹穿的比我還像新娘鸽捻。我一直安慰自己,他們只是感情好泽腮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诊赊,像睡著了一般厚满。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碧磅,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天碘箍,我揣著相機(jī)與錄音,去河邊找鬼鲸郊。 笑死丰榴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秆撮。 我是一名探鬼主播四濒,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了峻黍?” 一聲冷哼從身側(cè)響起复隆,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姆涩,沒想到半個(gè)月后挽拂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骨饿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年亏栈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏赘。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绒北,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出察署,到底是詐尸還是另有隱情闷游,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布贴汪,位于F島的核電站脐往,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扳埂。R本人自食惡果不足惜业簿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阳懂。 院中可真熱鬧梅尤,春花似錦、人聲如沸岩调。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽号枕。三九已至矾湃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堕澄,已是汗流浹背邀跃。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛙紫,地道東北人拍屑。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像坑傅,于是被迫代替她去往敵國和親僵驰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容