大數據-數據倉庫-數據傾斜

一、什麼是數據傾斜

簡單來說,數據傾斜就是數據的分佈不平衡,在處理數據時有些很快處理完,而有些又遲遲未能處理完,導致整體任務最重遲遲無法完成,這種現象就是數據傾斜造成的。

數據傾斜就是key分佈不均勻,分發到不同的reduce上,個別reduce任務特別重,導致其他reduce都完成,而這些個別的reduce遲遲不完成的情況。

二、數據傾斜原因

導致數據傾斜的原因有:

  1. key分佈不均勻
  2. map端數據傾斜,輸入文件太多且大小不一
  3. reduce端數據傾斜,分區器問題
  4. 某些sql語句本身容易產生數據傾斜
  5. 業務數據本身的特徵

三、數據傾斜的解決方案

3.1 參數調節

hive.map.aggr=true
Map端部分聚合,相當於Combiner
hive.groupby.skewindata=true

3.2 SQL語句調節

如何Join:
選取Join Key分佈最均勻的表作爲驅動表,做好列裁剪和filter操作,已達到兩表做join的時候,數據量相對變小的效果。

大小表Join:
使用map join讓小的維度表(1000條以下的記錄條數)先進內存,在map端完成reduce。

大表Join大表:
把空值的key編程一個字符串加上隨機數,把傾斜的數據分到不同的reduce上,由於null值關聯不上,處理後並不影響最終結果。

count distinct 大量相同特殊值:
count distinct時,將值爲空的情況單獨處理,如果是計算count distinct,可以不用處理,直接過濾,在最後結果中加1。如果還有其他計算,需要進行group by,可以先將值爲空的記錄單獨處理,再和其他計算結果進行union。

group by 維度過小:
採用 sum() group by 的方式來替換 count(distinct) 完成計算。

特殊情況特殊處理:
在業務邏輯優化效果不理想時,有時候可以將傾斜的數據單獨拿出來處理,最終再union 回去。

3.3 典型的業務場景
  1. 空值產生的數據傾斜

場景:如日誌中,常有信息缺失的問題,如日誌中的user_id,如果取其中的user_id和用戶表中的user_id關聯,會碰到數據傾斜的問題。
解決方法:user_id爲空的不參與關聯,或者賦與空值新的key值。

  1. 不同數據類型關聯產生數據傾斜

場景:用戶表中user_id字段爲int型,而log表中user_id字段有int和string 兩種類型。當按照user_id進行兩個表join操作時,默認的Hash操作會按int型的id來進行分配,這樣會導致所有的string類型id的記錄都分配到一個Reduce中。
解決方法:把數值類型轉換成字符串類型。

參考資料:
https://www.jianshu.com/p/42be5ca8b11d
https://www.jianshu.com/p/ab08de658adc
https://www.jianshu.com/p/18b7c3979879
https://www.jianshu.com/p/bde6525634da

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章