Hive解決資料傾斜方法

2021-10-09 03:39:02 字數 2750 閱讀 5719

注:group by 優於distinct group

情形:group by 維度過小,某值的數量過多

後果:處理某值的reduce非常耗時

解決方式:採用sum() group by的方式來替換count(distinct)完成計算。

2)count(distinct)

count(distinct xx)

情形:某特殊值過多

後果:處理此特殊值的reduce耗時;只有乙個reduce任務

解決方式:count distinct時,將值為空的情況單獨處理,比如可以直接過濾空值的行,在最後結果中加1。如果還有其他計算,需要進行group by,可以先將值為空的記錄單獨處理,再和其他計算結果進行union。

3)mapjoin

4)不同資料型別關聯產生資料傾斜

情形:比如使用者表中user_id欄位為int,log表中user_id欄位既有string型別也有int型別。當按照user_id進行兩個表的join操作時。

後果:處理此特殊值的reduce耗時;只有乙個reduce任務

預設的hash操作會按int型的id來進行分配,這樣會導致所有string型別id的記錄都分配到乙個reducer中。

解決方式:把數字型別轉換成字串型別

select * from users a

left outer join logs b

on a.usr_id = cast(b.user_id as string)

5)開啟資料傾斜時負載均衡

set hive.groupby.skewindata=true;
思想:就是先隨機分發並處理,再按照key group by來分發處理。

操作:當選項設定為true,生成的查詢計畫會有兩個mrjob。

第乙個mrjob 中,map的輸出結果集合會隨機分布到reduce中,每個reduce做部分聚合操作,並輸出結果,這樣處理的結果是相同的groupby key有可能被分發到不同的reduce中,從而達到負載均衡的目的;

第二個mrjob再根據預處理的資料結果按照groupby key分布到reduce中(這個過程可以保證相同的原始groupby key被分布到同乙個reduce中),最後完成最終的聚合操作。

點評:它使計算變成了兩個mapreduce,先在第乙個中在 shuffle 過程 partition 時隨機給 key 打標記,使每個key 隨機均勻分布到各個 reduce 上計算,但是這樣只能完成部分計算,因為相同key沒有分配到相同reduce上。

所以需要第二次的mapreduce,這次就回歸正常 shuffle,但是資料分布不均勻的問題在第一次mapreduce已經有了很大的改善,因此基本解決資料傾斜。因為大量計算已經在第一次mr中隨機分布到各個節點完成。

6)控制空值分布

將為空的key轉變為字串加隨機數或純隨機數,將因空值而造成傾斜的資料分不到多個reducer。

注:對於異常值如果不需要的話,最好是提前在where條件裡過濾掉,這樣可以使計算量大大減少

實踐中,可以使用case when對空值賦上隨機值。此方法比直接寫is not null更好,因為前者job數為1,後者為2.

使用case when例項1:

select userid, name from user_info a 

join

(select

case when userid is null then cast (rand(

47)* 100000 as int )

else userid end from user_read_log

) b on a.userid = b.userid

使用case when例項2:

select

'$' as thedate,

a.search_type,

a.query,

a.category,

a.cat_name,

a.brand_id,

a.brand_name,

a.dir_type,

a.rewcatid,

a.new_cat_name,

a.new_brand_id,

f.brand_name as new_brand_name,

a.pv,

a.uv,

a.ipv,

a.ipvuv,

a.trans_amt,

a.trans_num,

a.alipay_uv

from fdi_search_query_cat_qp_temp a

left outer join brand f

on f.pt=

'$000000' and case when a.new_brand_id is null then concat(

'hive',rand())

else a.new_brand_id end = f.brand_id;

如果上述的方法還不能解決,比如當有多個join的時候,建議建立臨時表,然後拆分hive sql語句。

Hive資料傾斜解決

什麼是資料傾斜?簡單來說資料傾斜就是資料的key的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。資料傾斜產生的原因是什麼?舉個 word count 的入門例子,它的map 階段就是形成 aaa 1 的形式,然後在reduce 階段進 行 value 相加,得出 aaa 出現的次數。若進行...

Hive資料傾斜解決方法總結

資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...

Hive資料傾斜解決方法總結

資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...