hive数据倾斜的解决办法
數(shù)據(jù)傾斜是進(jìn)行大數(shù)據(jù)計(jì)算時(shí)常見(jiàn)的問(wèn)題。主要分為map端傾斜和reduce端傾斜,map端傾斜主要是因?yàn)檩斎胛募笮〔痪鶆驅(qū)е?#xff0c;reduce端主要是partition不均勻?qū)е隆?/p>
在hive中遇到數(shù)據(jù)傾斜的解決辦法:
一、傾斜原因:map端緩慢,輸入數(shù)據(jù)文件多,大小不均勻
當(dāng)出現(xiàn)小文件過(guò)多,需要合并小文件。可以通過(guò)set hive.merge.mapfiles=true來(lái)解決。
set hive.map.aggr=true; //map端部分聚合,相當(dāng)于Combiner,可以減小壓力(默認(rèn)開(kāi)啟)
set hive.groupby.skewindata=true(默認(rèn)關(guān)閉);//有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡,當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢(xún)計(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è)過(guò)程可以保證相同的 Group By Key 被分布到同一個(gè) Reduce 中),最后完成最終的聚合操作。
單個(gè)文件大小稍稍大于配置的block塊的大寫(xiě),此時(shí)需要適當(dāng)增加map的個(gè)數(shù)。解決方法:set mapred.map.tasks個(gè)數(shù)
文件大小適中,但map端計(jì)算量非常大,如select id,count(*),sum(case when...),sum(case when...)...需要增加map個(gè)數(shù)。解決方法:set mapred.map.tasks個(gè)數(shù),set mapred.reduce.tasks個(gè)數(shù)
二、當(dāng)遇到一個(gè)大表和一個(gè)小表進(jìn)行join操作時(shí)
解決方法:小表在join左側(cè),大表在右側(cè),或使用mapjoin 將小表加載到內(nèi)存中。然后再對(duì)比較大的表進(jìn)行map操作。
join就發(fā)生在map操作的時(shí)候,這里的join并不會(huì)涉及reduce操作。map端join的優(yōu)勢(shì)就是在于沒(méi)有shuffle,
如:select /*+ MAPJOIN(a) */?
a.c1, b.c1 ,b.c2 from a join b?
where a.c1 = b.c1;?
三、遇到需要進(jìn)行join的但是關(guān)聯(lián)字段有數(shù)據(jù)為null,如表一的id需要和表二的id進(jìn)行關(guān)聯(lián),null值的reduce就會(huì)落到一個(gè)節(jié)點(diǎn)上
解決方法1:子查詢(xún)中過(guò)濾掉null值,id為空的不參與關(guān)聯(lián)
解決方法2:用case when給空值分配隨機(jī)的key值(字符串+rand())
四、不同數(shù)據(jù)類(lèi)型關(guān)聯(lián)產(chǎn)生數(shù)據(jù)傾斜
場(chǎng)景:一張表s8的日志,每個(gè)商品一條記錄,要和商品表關(guān)聯(lián)。但關(guān)聯(lián)卻碰到傾斜的問(wèn)題。s8的日志中有字符串商品id,也有數(shù)字的商品id,類(lèi)型是string的,但商品中的數(shù)字id是bigint的。猜測(cè)問(wèn)題的原因是把s8的商品id轉(zhuǎn)成數(shù)字id做hash來(lái)分配reduce,所以字符串id的s8日志,都到一個(gè)reduce上了,解決的方法驗(yàn)證了這個(gè)猜測(cè)。
解決方法:把數(shù)字類(lèi)型轉(zhuǎn)換成字符串類(lèi)型
Select * from s8_log aLeft outer join r_auction_auctions bOn a.auction_id = cast(b.auction_id as string);五、當(dāng)HiveQL中包含count(distinct)時(shí)
如果數(shù)據(jù)量非常大,執(zhí)行如select a,count(distinct b) from t group by a;類(lèi)型的SQL時(shí),會(huì)出現(xiàn)數(shù)據(jù)傾斜的問(wèn)題。
解決方法:使用sum...group by代替。如select a,sum(1) from (select a, b from t group by a,b) group by a;
六、join和Group的優(yōu)化?
2.1 對(duì)于普通的join操作,會(huì)在map端根據(jù)key的hash值,shuffle到某一個(gè)reduce上去,在reduce端做join連接操作,內(nèi)存中緩存join左邊的表,遍歷右邊的表,一次做join操作。所以在做join操作時(shí)候,將數(shù)據(jù)量多的表放在join的右邊。?
當(dāng)數(shù)據(jù)量比較大,并且key分布不均勻,大量的key都shuffle到一個(gè)reduce上了,就出現(xiàn)了數(shù)據(jù)的傾斜。?
在map端產(chǎn)生join
? ? ? ? ?mapJoin的主要意思就是,當(dāng)鏈接的兩個(gè)表是一個(gè)比較小的表和一個(gè)特別大的表的時(shí)候,我們把比較小的table直接放到內(nèi)存中去,然后再對(duì)比較大的表格進(jìn)行map操作。join就發(fā)生在map操作的時(shí)候,每當(dāng)掃描一個(gè)大的table中的數(shù)據(jù),就要去去查看小表的數(shù)據(jù),哪條與之相符,繼而進(jìn)行連接。這里的join并不會(huì)涉及reduce操作。map端join的優(yōu)勢(shì)就是在于沒(méi)有shuffle,
2.2 對(duì)于Group操作,首先在map端聚合,最后在reduce端坐聚合,hive默認(rèn)是這樣的,以下是相關(guān)的參數(shù)?
· hive.map.aggr = true是否在 Map 端進(jìn)行聚合,默認(rèn)為 True?
· hive.groupby.mapaggr.checkinterval = 100000在 Map 端進(jìn)行聚合操作的條目數(shù)目
轉(zhuǎn)載自:https://www.cnblogs.com/kongcong/p/7777092.html
轉(zhuǎn)載于:https://www.cnblogs.com/wangbin2188/p/10364375.html
總結(jié)
以上是生活随笔為你收集整理的hive数据倾斜的解决办法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JSON WEB TOKEN(JWT)的
- 下一篇: table表格固定前几列,其余的滚动