? ? ? 近來双谆,求職數(shù)據(jù)分析師常被問到:數(shù)據(jù)傾斜如何調(diào)優(yōu)狸捅?對于經(jīng)常使用HQL處理大數(shù)據(jù)的同學(xué)偎巢,這個問題并不陌生:任務(wù)進(jìn)度長時間維持在99%微王,而查看監(jiān)控頁面屡限,發(fā)現(xiàn)只有某幾個reduce子任務(wù)尚未完成,十分詭異炕倘。
? ? ? 要解決數(shù)據(jù)傾斜這個問題钧大,我們需要先了解下數(shù)據(jù)傾斜產(chǎn)生的原因是什么?一般由于以下三個操作:count(distinct *), group by , join引起的罩旋,導(dǎo)致某個reducer處理的數(shù)據(jù)過多引起處理時間非常耗時啊央。
? ? ? 因此解決調(diào)優(yōu)的方式可以從3方面入手嘗試:
? ? ? 1. 數(shù)據(jù)層面
? ? ? 有損方法:找到異常數(shù)據(jù),符合業(yè)務(wù)場景的前提下涨醋,直接過濾
? ? ? 無損方法:對分布不均勻的數(shù)據(jù)瓜饥,先對key做一層hash,先將數(shù)據(jù)打散增大并行度浴骂,再匯聚
? ? ? 2. 代碼方面:
? ? ? ?使用sum() group by 替代coun(distinct )
? ? ? 顯式使用mapjoin:/*+mapjoin(x)*/
? ? ? 避免多表同時join乓土,使用臨時中間表過渡
? ? ? 3. 參數(shù)方面:
? ? ? 負(fù)載均衡:hive.groupby.skewindata=true
? ? ? map端聚合:hive.map.aggr = true
? ? ? 增加reduce?個數(shù): hive.exec.reducer.max = / mapred.reduce.tasks =
? ? ? 采用壓縮:hive.exec.compress.output = true /mapredu.output.compress = true (這個方式不完全是解決數(shù)據(jù)傾斜問題,減少IO讀寫和網(wǎng)絡(luò)傳輸溯警,提高效率)