1、數(shù)據(jù)傾斜現(xiàn)象
數(shù)據(jù)傾斜就是數(shù)據(jù)的key的分化嚴(yán)重不均,造成一部分?jǐn)?shù)據(jù)很多,一部分?jǐn)?shù)據(jù)很少的局面。
數(shù)據(jù)頻率傾斜 —— 某一個區(qū)域的數(shù)據(jù)量要遠(yuǎn)遠(yuǎn)大于其他區(qū)域。
數(shù)據(jù)大小傾斜 —— 部分記錄的大小遠(yuǎn)遠(yuǎn)大于平均值。
2、數(shù)據(jù)傾斜產(chǎn)生的原因
(1)Hadoop框架的特性
Job數(shù)多的作業(yè)運(yùn)行效率會相對比較低;
countdistinct、group by、join等操作,觸發(fā)了shuffle動作,導(dǎo)致全部相同key的值聚集在一個或幾個節(jié)點(diǎn)上,很容易發(fā)生單點(diǎn)問題。
(2)具體原因
key 分布不均勻,某一個key的數(shù)據(jù)條數(shù)比其他key多太多;
業(yè)務(wù)數(shù)據(jù)自帶的特性;
建表時考慮不全面;
可能某些 HQL 語句自身就存在數(shù)據(jù)傾斜問題。
3、數(shù)據(jù)傾斜解決方案
從業(yè)務(wù)和數(shù)據(jù)方面解決數(shù)據(jù)傾斜
有損的方法: 找到異常數(shù)據(jù)。
無損的方法:
對分布不均勻的數(shù)據(jù),進(jìn)行單獨(dú)計(jì)算,首先對key做一層hash,把數(shù)據(jù)打散,讓它的并行度變大,之后進(jìn)行匯集數(shù)據(jù)預(yù)處理
Hadoop平臺的解決方法
1)針對join產(chǎn)生的數(shù)據(jù)傾斜
場景一:大表和小表join產(chǎn)生的數(shù)據(jù)傾斜
① 在多表關(guān)聯(lián)情況下,將小表(關(guān)聯(lián)鍵記錄少的表)依次放到前面,這樣能夠觸發(fā)reduce端減少操作次數(shù),從而減少運(yùn)行時間。
② 同時使用Map Join讓小表緩存到內(nèi)存。在map端完成join過程,這樣就能省掉redcue端的工作。
需要注意:這一功能使用時,需要開啟map-side join的設(shè)置屬性:
set hive.auto.convert.join=true #(默認(rèn)是false)
③ 還可以對使用這個優(yōu)化的小表的大小進(jìn)行設(shè)置:
set hive.mapjoin.smalltable.filesize=25000000 #(默認(rèn)值25M)
場景二:大表和大表的join產(chǎn)生的數(shù)據(jù)傾斜
① 將異常值賦一個隨機(jī)值,以此來分散key,均勻分配給多個reduce去執(zhí)行
set hive.exec.reducers.bytes.per.reducer = 1000000000
② 如果key值都是有效值的情況下,需要設(shè)置以下幾個參數(shù)來解決也就是每個節(jié)點(diǎn)的reduce,其 默認(rèn)是處理數(shù)據(jù)地大小為1G,如果join 操作也產(chǎn)生了數(shù)據(jù)傾斜,那么就在hive 中設(shè)定
set hive.optimize.skewjoin = true;
set hive.skewjoin.key = skew_key_threshold #(default = 100000)
2)group by 造成的數(shù)據(jù)傾斜
解決方式相對簡單:文章來源:http://www.zghlxwxcb.cn/news/detail-403125.html
#(默認(rèn)true) 這個配置項(xiàng)代表是否在map端進(jìn)行聚合,相當(dāng)于Combiner
hive.map.aggr=true
hive.groupby.skewindata
3)count(distinct)或者其他參數(shù)不當(dāng)造成的數(shù)據(jù)傾斜
① reduce個數(shù)太少
set mapred.reduce.tasks=800
② HiveQL中包含count(distinct)時
使用sum…group byl來替代。例如select a,sum(1) from (select a, b from t group by a,b) group by a;文章來源地址http://www.zghlxwxcb.cn/news/detail-403125.html
到了這里,關(guān)于MapReduce數(shù)據(jù)傾斜產(chǎn)生的原因及其解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!