hive資料傾斜及解決辦法

2021-10-07 22:43:36 字數 2037 閱讀 3246

資料傾斜簡單的來講就是資料分布不均勻。導致在處理資料時,有些任務很快處理結束,而有些任務遲遲未處理完。資料傾斜主要為reduce端傾斜,原因為主要是partition(分割槽)不均勻導致。

分割槽是對key求hash值,根據hash值取模(預設)決定該key被分到某個分割槽,從而進入到某個reduce。當key的分布不均勻或某些key太集中時。key值相同的資料就會使得被分配到同乙個reduce,就會造成這個reduce所要處理的資料量過大。降低整個job的效率。

①業務資料本身的特性

②建表時考慮不周

③操作表時:

1.引數調節:

hive.map.aggr = true

map 端部分聚合,相當於combiner

hive.groupby.skewindata=true

有資料傾斜的時候進行負載均衡,當選項設定為 true,生成的查詢計畫會有兩個 mr job。

第乙個 mr job 中,map 的輸出結果集合會隨機分布到 reduce 中,每個 reduce 做部分聚合操作,並輸出結果(作為預處理的資料結果),這樣處理的結果是相同的 group by key 有可能被分發到不同的 reduce 中,從而達到負載均衡的目的。

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

擴充套件:當count(distinct) 、group by操作時,對於大資料量中,如果出現資料傾斜時,會使得效能非常差,解決辦法為設定資料負載均衡,其設定方法為設定hive.groupby.skewindata引數

2.sql語句調節:

驅動表:外層迴圈,若能只進行一次io把所有資料拿出來最好

被驅動表:裡層迴圈,需要不斷的拿外層迴圈傳進來的每條記錄去匹配

1)兩張大表join時:

關於驅動表的選取,選用join key分布最均勻的表作為驅動表。

做好列裁剪和filter操作,以達到兩表做join的時候,資料量相對變小的效果。

①大小表join:

使用map join讓小的維度表先進記憶體,在map階段已經完成join,避免reduce處理。

mapjoin時,小表的預設大小越為25m,可以進行手動設定。

②大表join大表:

把空值的key變成乙個字串加上隨機數,把傾斜的資料分到不同的reduce上,由於null值關聯不上,處理後並不影響最終結果。

1.空值產生的資料傾斜

①方法一:空值不參與join,最後使用union合起來

select

*from 表a a

join 表b b

on a.欄位 is not null

and a.欄位 = b.欄位

union all

select

*from 表a a

where a.欄位 is

null

;

②方法二:給空值乙個新的key值

select

*from 表a a

left join 表b b

on case when a.欄位 is

null then concat

(『hive』,

rand()

)else a.欄位 end = b.欄位;

建議使用方法二,效率更高,而且將空值變成字串+隨機數可使得分割槽時分到不同的reduce上,避免資料傾斜

2.不同型別資料join產生的資料傾斜

如果join時的字段有不同型別時,比如有int,也有string時,可以轉換為相同型別,都轉換為字串型別,

select

*from 表a a

left join 表b b

on a.id =

cast

(b.id as

string

)

Hive資料傾斜解決辦法總結

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

Hive資料傾斜解決辦法總結

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

Hadoop資料傾斜及解決辦法

資料傾斜 就是大量的相同key被partition分配到乙個分割槽裡,map reduce程式執行時,reduce節點大部分執行完畢,但是有乙個或者幾個reduce節點執行很慢,導致整個程式的處理時間很長,這是因為某乙個key的條數比其他key多很多 有時是百倍或者千倍之多 這條key所在的redu...