spark 數(shù)據(jù)傾斜總結(jié)

一陪每、數(shù)據(jù)傾斜概念

? ? ? 1.1影晓、是指shuffle過程中,必須將各個(gè)節(jié)點(diǎn)上相同key拉取到某個(gè)節(jié)點(diǎn)上的一個(gè)task來進(jìn)行處理檩禾,此時(shí)如果某個(gè)key對(duì)應(yīng)的數(shù)據(jù)特別大的話挂签,就會(huì)發(fā)生數(shù)據(jù)傾斜。

? ? ? 1.2盼产、數(shù)據(jù)傾斜舉例:

二饵婆、數(shù)據(jù)傾斜現(xiàn)象

? ? ? 2.1、同一個(gè)stage中相同task絕大部分task執(zhí)行時(shí)間快戏售,少數(shù)幾個(gè)執(zhí)行時(shí)間慢侨核。往往慢task耗時(shí)是快task耗時(shí)的2-3倍以上草穆。

? ? ? 2.2、原本正常運(yùn)行的任務(wù)某天突然oom,也可能是發(fā)生了數(shù)據(jù)傾斜搓译。

三悲柱、定位數(shù)據(jù)傾斜的代碼

? ? ? 3.1、數(shù)據(jù)傾斜是發(fā)生在shuffle過程中些己,定位代碼中具有 shuffle的算子豌鸡。例如:reduceBykey,groupByKey,aggregateByKey,distinct,cogroup,join,partionBy,repartion.

? ? 3.2、結(jié)合任務(wù)管理界面轴总,比對(duì)同一個(gè)task的執(zhí)行時(shí)間直颅,與數(shù)據(jù)量。如果有個(gè)別相差較大就說有數(shù)據(jù)傾斜怀樟,從而根據(jù)task定位到對(duì)應(yīng)stage的shuffle算子功偿。

? ? 3.3、對(duì)數(shù)據(jù)進(jìn)行無放回采樣往堡,查看key的分布械荷,得到傾斜的key值,再從代碼中定位哪些地方會(huì)有這些key參與從而定位到對(duì)應(yīng)的代碼塊虑灰。

四吨瞎、數(shù)據(jù)傾斜解決方案

4.1、對(duì)數(shù)據(jù)進(jìn)行etl 預(yù)處理數(shù)據(jù)

? ? ? ? ? ? ? 使用場景:

? ? ? ? ? ? ? ? ? ? a穆咐、hive中文件大小不均勻颤诀,有的大有的小。spark在讀取大文件時(shí)會(huì)對(duì)大文件按对湃。照block快進(jìn)行切分崖叫,小文件不會(huì)切分。如果不進(jìn)行預(yù)處理拍柒,那么小文件處理速度快心傀,大文件處理慢、資源沒有得到充分利用拆讯,可以先對(duì)hive數(shù)據(jù)進(jìn)行清洗脂男、去重、重新分區(qū)等操作來將原本不均勻的數(shù)據(jù)重新均勻的存放在多個(gè)文件中种呐。以簡化后面依賴此數(shù)據(jù)源的任務(wù)宰翅。

? ? ? ? ? ? ? ? ? ? b、hive中key分布不均勻陕贮,可以將shuffle類操作在先進(jìn)行處理堕油。處理完畢之后,spark應(yīng)用不必進(jìn)行重復(fù)的shuffle,直接用處理后的結(jié)果就可以掉缺。在頻繁調(diào)用spark作業(yè)并且有實(shí)效要求的場景中卜录,如果今天作業(yè)要用到昨天數(shù)據(jù)的聚合數(shù)據(jù),可以每天進(jìn)行一次預(yù)處理眶明,將數(shù)據(jù)聚合好艰毒,從而保證今天作業(yè)的實(shí)效要求。

4.2搜囱、過濾少數(shù)導(dǎo)致傾斜的key

? ? ? ? ? ? ? 使用場景:

? ? ? ? ? ? ? ? ? ? ? a丑瞧、傾斜key沒有業(yè)務(wù)有意義,比如存在很多key是‘-’(‘-’在我們系統(tǒng)代表空)的記錄蜀肘,那么久可以直接filter掉來解決’-‘帶來的數(shù)據(jù)傾斜绊汹。

? ? ? ? ? ? ? ? ? ? ? b、傾斜key是有意義的扮宠,那么就需要單獨(dú)拎出來進(jìn)行單獨(dú)處理西乖。

4.3、提高shuffle操作的并行度

使用場景:同一個(gè)task被分配了多個(gè)傾斜的key.試圖增加shuffle read task的數(shù)量坛增,可以讓原本分配給一個(gè)task的多個(gè)key分配給多個(gè)task获雕,從而讓每個(gè)task處理比原來更少的數(shù)據(jù)。實(shí)現(xiàn)起來比較簡單收捣,可以有效緩解和減輕數(shù)據(jù)傾斜的影響届案,原理如下圖

4.4、兩階段聚合(局部聚合+全局聚合)

? ? ? ? ? ? ? 使用場景:對(duì)RDD執(zhí)行reduceByKey等聚合類shuffle算子或者在Spark SQL中使用group by語句進(jìn)行分組聚合時(shí)罢艾,比較適用這種方案楣颠。如果是join類的shuffle操作,還得用其他的解決方案咐蚯。

? ? ? ? ? ? ? 實(shí)現(xiàn)方式:將原本相同的key通過附加隨機(jī)前綴的方式球碉,變成多個(gè)不同的key,就可以讓原本被一個(gè)task處理的數(shù)據(jù)分散到多個(gè)task上去做局部聚合仓蛆,進(jìn)而解決單個(gè)task處理數(shù)據(jù)量過多的問題。接著去除掉隨機(jī)前綴挎春,再次進(jìn)行全局聚合看疙,就可以得到最終的結(jié)果。具體原理見下圖直奋。

4.5能庆、將reduce join轉(zhuǎn)為map join

? ? ? ? ? ? ? ?使用場景:join類操作,存在小表join大表的場景脚线「榈ǎ可以將小表進(jìn)行廣播從而避免shuffle

4.6、采樣傾斜key并分拆join操作

? ? ? ? ? ? ? ?使用場景:適用于join類操作中,由于相同key過大占內(nèi)存渠旁,不能使用4.5方案攀例,但傾斜key的種數(shù)不是很多的場景。

? ? ? ? ? ? ? ? 實(shí)現(xiàn)方式:

? ? ? ? ? ? ? ? ? ? ? ? 第一步顾腊、 對(duì)包含少數(shù)幾個(gè)數(shù)據(jù)量過大的key的那個(gè)RDD粤铭,通過sample算子采樣出一份樣本來,然后統(tǒng)計(jì)一下每個(gè)key的數(shù)量杂靶,計(jì)算出來數(shù)據(jù)量最大的是哪幾個(gè)key.

? ? ? ? ? ? ? ? ? ? ? ? 第二步梆惯、將這幾個(gè)key對(duì)應(yīng)的數(shù)據(jù)從原來的RDD中拆分出來,形成一個(gè)單獨(dú)的RDD吗垮,并給每個(gè)key都打上n以內(nèi)的隨機(jī)數(shù)作為前綴垛吗,而不會(huì)導(dǎo)致傾斜的大部分key形成另外一個(gè)RDD。

? ? ? ? ? ? ? ? ? ? ? 第三步烁登、 接著將需要join的另一個(gè)RDD怯屉,也過濾出來那幾個(gè)傾斜key對(duì)應(yīng)的數(shù)據(jù)并形成一個(gè)單獨(dú)的RDD,將每條數(shù)據(jù)膨脹成n條數(shù)據(jù)防泵,這n條數(shù)據(jù)都按順序附加一個(gè)0~n的前綴蚀之,不會(huì)導(dǎo)致傾斜的大部分key也形成另外一個(gè)RDD。

? ? ? ? ? ? ? ? ? ? ? 第四步捷泞、再將附加了隨機(jī)前綴的獨(dú)立RDD與另一個(gè)膨脹n倍的獨(dú)立RDD進(jìn)行join足删,此時(shí)就可以將原先相同的key打散成n份,分散到多個(gè)task中去進(jìn)行join了锁右。

? ? ? ? ? ? ? ? ? ? ? 第五步失受、 而另外兩個(gè)普通的RDD就照常join即可。最后將兩次join的結(jié)果使用union算子合并起來即可咏瑟,就是最終的join結(jié)果拂到。

具體原理見下圖:

4.7、使用隨機(jī)前綴和擴(kuò)容RDD進(jìn)行join

? ? ? ? ? ? ? 使用場景:如果在進(jìn)行join操作時(shí)码泞,RDD中有大量的key導(dǎo)致數(shù)據(jù)傾斜兄旬。

? ? ? ? ? ? ? 實(shí)現(xiàn)方式:同4.6,不同的是它不需要對(duì)原先rdd進(jìn)行傾斜key過濾將原來rdd形成含傾斜key的rdd余寥,與不含傾斜key的rdd领铐。直接對(duì)整個(gè)原本的rdd的key一邊進(jìn)行加隨機(jī)數(shù),另一邊進(jìn)行相應(yīng)倍數(shù)的擴(kuò)容宋舷。而這一種方案是針對(duì)有大量傾斜key的情況绪撵,沒法將部分key拆分出來進(jìn)行單獨(dú)處理,因此只能對(duì)整個(gè)RDD進(jìn)行數(shù)據(jù)擴(kuò)容祝蝠,對(duì)內(nèi)存資源要求很高音诈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幻碱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子细溅,更是在濱河造成了極大的恐慌褥傍,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谒兄,死亡現(xiàn)場離奇詭異摔桦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)承疲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門邻耕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人燕鸽,你說我怎么就攤上這事兄世。” “怎么了啊研?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵御滩,是天一觀的道長。 經(jīng)常有香客問我党远,道長削解,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任沟娱,我火速辦了婚禮氛驮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘济似。我一直安慰自己矫废,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布砰蠢。 她就那樣靜靜地躺著蓖扑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪台舱。 梳的紋絲不亂的頭發(fā)上律杠,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音竞惋,去河邊找鬼俩功。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碰声,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熬甫,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胰挑,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞻颂,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤豺谈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贡这,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茬末,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年盖矫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丽惭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辈双,死狀恐怖责掏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情湃望,我是刑警寧澤换衬,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站证芭,受9級(jí)特大地震影響瞳浦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜废士,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一叫潦、第九天 我趴在偏房一處隱蔽的房頂上張望湃密。 院中可真熱鬧诅挑,春花似錦、人聲如沸泛源。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缎玫。三九已至赃磨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邻辉,已是汗流浹背溪王。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工腮鞍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莹菱。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓移国,卻偏偏與公主長得像,于是被迫代替她去往敵國和親道伟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迹缀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354