本篇內(nèi)容主要講解“Hive數(shù)據(jù)傾斜的概念及處理方式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Hive數(shù)據(jù)傾斜的概念及處理方式”吧!
江安網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,江安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為江安上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的江安做網(wǎng)站的公司定做!
1.1 數(shù)據(jù)傾斜
數(shù)據(jù)傾斜就是數(shù)據(jù)的分布不平衡,某些地方特別多,某些地方又特別少,導(dǎo)致的在處理數(shù)據(jù)的時(shí)候,有些很快就處理完了,而有些又遲遲未能處理完,導(dǎo)致整體任務(wù)最終遲遲無法完成,這種現(xiàn)象就是數(shù)據(jù)傾斜。
針對(duì)mapreduce的過程來說就是,有多個(gè)reduce,其中有一個(gè)或者若干個(gè)reduce要處理的數(shù)據(jù)量特別大,而其他的reduce處理的數(shù)據(jù)量則比較小,那么這些數(shù)據(jù)量小的reduce很快就可以完成,而數(shù)據(jù)量大的則需要很多時(shí)間,導(dǎo)致整個(gè)任務(wù)一直在等它而遲遲無法完成。
跑mr任務(wù)時(shí)常見的reduce的進(jìn)度總是卡在99%,這種現(xiàn)象很大可能就是數(shù)據(jù)傾斜造成的。
1.2 產(chǎn)生數(shù)據(jù)傾斜的原因
key分布不均勻
上面就說過,數(shù)據(jù)傾斜是因?yàn)閞educe的數(shù)據(jù)量大小差異過大,而reduce的數(shù)據(jù)是分區(qū)的結(jié)果,分區(qū)是對(duì)key求hash值,根據(jù)hash值決定該key被分到某個(gè)分區(qū),進(jìn)而進(jìn)入到某個(gè)reduce,而如果key很集中或者相同,那么計(jì)算得到它們的hash值可能一樣,那么就會(huì)被分配到同一個(gè)reduce,就會(huì)造成這個(gè)reduce所要處理的數(shù)據(jù)量過大。
業(yè)務(wù)數(shù)據(jù)本身的特性
比如某些業(yè)務(wù)數(shù)據(jù)作為key的字段本就很集中,那么結(jié)果肯定會(huì)導(dǎo)致數(shù)據(jù)傾斜啊。
還有其他的一些原因,但是,根本原因還是key的分布不均勻,而其他的原因就是會(huì)造成key不均勻,進(jìn)而導(dǎo)致數(shù)據(jù)傾斜的后果,所以說根本原因是key的分布不均勻。
1.3 數(shù)據(jù)傾斜的表現(xiàn)
任務(wù)進(jìn)度長(zhǎng)時(shí)間維持在99%(或100%),查看任務(wù)監(jiān)控頁面,發(fā)現(xiàn)只有少量(1個(gè)或幾個(gè))reduce子任務(wù)未完成。因?yàn)槠涮幚淼臄?shù)據(jù)量和其他reduce差異過大。
單一reduce的記錄數(shù)與平均記錄數(shù)差異過大,通??赡苓_(dá)到3倍甚至更多。 最長(zhǎng)時(shí)長(zhǎng)遠(yuǎn)大于平均時(shí)長(zhǎng)。
2.1 設(shè)置參數(shù)
hive.map.aggr = true // Map 端部分聚合,相當(dāng)于Combiner;
hive.groupby.skewindata=true //
有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡,當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢計(jì)劃會(huì)有兩個(gè) MR Job。第一個(gè) MR Job 中,Map 的輸出結(jié)果集合會(huì)隨機(jī)分布到 Reduce 中,每個(gè) Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group By Key 有可能被分發(fā)到不同的 Reduce 中,從而達(dá)到負(fù)載均衡的目的;第二個(gè) MR Job再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group By Key 分布到 Reduce 中(這個(gè)過程可以保證相同的 Group By Key 被分布到同一個(gè) Reduce 中),最后完成最終的聚合操作。
2.2 SQL語句優(yōu)化
大小表join
使用map join讓小的維度表(1000條以下的記錄條數(shù)) 先進(jìn)內(nèi)存。在map端完成reduce。
大表Join大表
把空值的key變成一個(gè)字符串加上隨機(jī)數(shù),把傾斜的數(shù)據(jù)分到不同的reduce上,由于null值關(guān)聯(lián)不上,處理后并不影響最終結(jié)果。
count distinct大量相同特殊值
count distinct時(shí),將值為空的情況單獨(dú)處理,如果是計(jì)算count distinct,可以不用處理,直接過濾,在最后結(jié)果中加1。如果還有其他計(jì)算,需要進(jìn)行g(shù)roup by,可以先將值為空的記錄單獨(dú)處理,再和其他計(jì)算結(jié)果進(jìn)行union。
特殊情況特殊處理
在業(yè)務(wù)邏輯優(yōu)化效果的不大情況下,有些時(shí)候是可以將傾斜的數(shù)據(jù)單獨(dú)拿出來處理。最后union回去。
到此,相信大家對(duì)“Hive數(shù)據(jù)傾斜的概念及處理方式”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!