每日一題:什么是數(shù)據(jù)傾斜及解決方案?
每日一題?精選常考面試題,將其匯總成專欄,利用零碎時間為職業(yè)保駕護航,建議大家獨立思考答題。題目1、何為數(shù)據(jù)傾斜?
數(shù)據(jù)傾斜在MapReduce編程模型中十分常見,用最通俗易懂的話來說,數(shù)據(jù)傾斜無非就是大量的相同key被partition分配到一個分區(qū)里,造成了'一個人累死,其他人閑死'的情況,這種情況是我們不能接受的,這也違背了并行計算的初衷,首先一個節(jié)點要承受著巨大的壓力,而其他節(jié)點計算完畢后要一直等待這個忙碌的節(jié)點,也拖累了整體的計算時間,可以說效率是十分低下的。
2、數(shù)據(jù)傾斜表現(xiàn)
1、絕大多數(shù)task執(zhí)行得都非常快,但個別task執(zhí)行的極慢。?
2、原本能正常執(zhí)行的Spark作業(yè),某天突然爆出OOM(內(nèi)存溢出)異常。觀察異常棧,是我們寫的業(yè)務代碼造成的
3、解決方案
1、增加jvm內(nèi)存,這適用于第一種情況(唯一值非常少,極少數(shù)值有非常多的記錄值(唯一值少于幾千)),這種情況下,往往只能通過硬件的手段來進行調(diào)優(yōu),增加jvm內(nèi)存可以顯著的提高運行效率。
2、增加reduce的個數(shù),這適用于第二種情況(唯一值比較多,這個字段的某些值有遠遠多于其他值的記錄數(shù),但是它的占比也小于百分之一或千分之一),我們知道,這種情況下,最容易造成的結(jié)果就是大量相同key被partition到一個分區(qū),從而一個reduce執(zhí)行了大量的工作,而如果我們增加了reduce的個數(shù),這種情況相對來說會減輕很多,畢竟計算的節(jié)點多了,就算工作量還是不均勻的,那也要小很多。
3、自定義分區(qū),這需要用戶自己繼承partition類,指定分區(qū)策略,這種方式效果比較顯著。
4、重新設計key,有一種方案是在map階段時給key加上一個隨機數(shù),有了隨機數(shù)的key就不會被大量的分配到同一節(jié)點(小幾率),待到reduce后再把隨機數(shù)去掉即可。
5、使用combinner合并,combinner是在map階段,reduce之前的一個中間階段,在這個階段可以選擇性的把大量的相同key數(shù)據(jù)先進行一個合并,可以看做是local reduce,然后再交給reduce來處理,這樣做的好處很多,即減輕了map端向reduce端發(fā)送的數(shù)據(jù)量(減輕了網(wǎng)絡帶寬),也減輕了map端和reduce端中間的shuffle階段的數(shù)據(jù)拉取數(shù)量(本地化磁盤IO速率),推薦使用這種方法。
為更好的交流學習,應讀者的要求,我建立了一個交流群,有需要的同學可以在下方公眾號后臺回復關鍵字:面試,即可獲取快速通道。(長按三秒,即可進入)
后臺已放置一份精心整理的技術干貨,查看即可獲取!后臺回復關鍵字:面試,帶你進入高手如云的學習交流群!
推薦閱讀
