解決hive中資料傾斜問題

2021-10-17 16:13:50 字數 3032 閱讀 5073

平常工作中我們在使用hive處理業務問題的時候不可避免的會遇到資料傾斜的問題,資料傾斜的本質就是key的分布不均勻,導致分到不同reduce上的資料量差距或大或小,當資料量差距過大的時候就造成了資料傾斜,使得某乙個reduce的負擔過大,導致任務遲遲不能完成。

1.key分布不均勻。

2. map端資料傾斜,輸入檔案過多,並且大小不統一。

3. reduce端資料傾斜,分割槽器存在問題。

4.業務資料本身特徵。

1.調節hive中的引數

如下所示:

set hive.map.aggr=

true

;set hive.groupby.skewindata=

true

;

hive.map.aggr=true這個引數是用來設定在map端進行部分聚合的,相當於combiner

hive.groupby.skewindata=true這個引數設定為true在發生資料傾斜的時候,會生成兩個mr job,第乙個mr job會先將key進行隨機分布,盡量均勻的分布在不同的reduce中,每個reduce中先將資料進行部分聚合,然後再由第二個mr job處理資料,這個時候資料已經是經過部分聚合的結果資料,會將相同key的資料都分到乙個reduce當中,這個時候再進行統一的group by key處理基本上就會避免發生某個reduce壓力過大的情況。

2.優化mapreduce

如下所示:

set hive.

merge

.mapfiles=

true

;set hive.mapred.map.tasks=number;

set hive.mapred.reduce.tasks=number;
set hive.mapred.reduce.tasks=number通過這個命令來調節reduce的數量,這個一般只是適合某些業務場景的資料傾斜問題,比如商品型別中有80種資料量比較大的不同分類都在乙個reduce中進行聚合,這個時候增加reduce的個數,在進行hash分割槽的時候可能就會將這80種商品型別分發到不同的reduce當中,增加reduce的個數來處理資料傾斜的問題還是具備很強的侷限性的,而且不一定能夠起作用。

3.sql優化

3.1null值問題產生的資料傾斜

null值問題產生的資料傾斜,這在實際業務中是常見的問題,比如說流量域中的使用者行為日誌資料,有時就會發生user_id資料丟失的問題,這個時候user_id就會產生大量的空值,這個時候如果和使用者資訊表進行關聯就會發生資料傾斜的問題,解決方式如下所示:

-- 1.這種情況在join的時候直接過濾空值,最後給union all上

select

*from a

joinbon

a.id is

notnull

and a.id = b.id

union

allselect

*from

a where a.id is

null

;-- 2.給空值欄位取乙個字串常量+隨機數

select

*from a

left

outer

join

b on

case

when a.id is

null

then concat(

'常量字段'

,rand())

else a.id

end= b.id

第二種方法和第一種方法相比要更好一些,因為 io次數 少了,作業數也少了,第一種方法中,使用者行為日誌表讀了兩次,jobs肯定是 2,第二種方法是 1。這個優化適合無效 id產生的資料傾斜,把空值的key變成乙個字串加上乙個隨機數,就能把造成資料傾斜的 資料分到不同的reduce上解決資料傾斜的問題。使本身為 null 的所有記錄不會擁擠在同乙個 reducetask了,會由於有替代的 隨機字串值,而分散到了多個 reducetask中了,由於null值關聯不上,處理後並不影響最終結果。

3.2 小表關聯大表

在使用 hvie處理資料的時候,涉及到小表和大表關聯的時候,這個問題一般是比較好解決的,我們只需要將小表先塞進記憶體,類似於spark中的廣播變數,實現方式如下所示:

set hive.auto.

convert

.join

=true

;//設定 mapjoin 優化自動開啟

set hive.mapjoin.smalltable.filesize=

25000000

//可以根據情況設定具體值

3.2 大表關聯大表

1.在大表和大表關聯的時候設定map join就已經不起作用了,因為不會將任何一張大表廣播到map端,防止大表對於記憶體的壓力過大導致記憶體浪費,這個時候我們可以先將兩張大表中的無用的列和行進行過濾,然後再進行關聯,如果無用的資料比較多,這樣做就可以很大程度上減輕節點的壓力,避免資料傾斜的問題。

2.如果兩張大表確實有這麼多的資料要進行關聯我們可以嘗試如下方法:

set hive.

optimize

.skewjoin =

true

;set hive.skewjoin.

key= skew_key_threshold (default

=100000)

hive 在執行的時候沒有辦法判斷哪個key 會產生多大的傾斜,所以使用這個引數控制傾斜的閾值,如果超過這個值,新的值會傳送給那些還沒有達到的reduce。

Hive解決資料傾斜問題

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

Hive解決資料傾斜問題

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

Hive中資料傾斜問題

在做shuffle階段的優化過程中,遇到了資料傾斜的問題,造成了對一些情況下優化效果不明顯。主要是因為在job完成後的所得到的counters是整個job的總和,優化是基於這些counters得出的平均值,而由於資料傾斜的原因造成map處理資料量的差異過大,使得這些平均值能代表的價值降低。hive的...