【Hive】Hive數據傾斜

數據傾斜:

hive在跑數據時經常會出現數據傾斜的情況,使的作業經常reduce完成在99%後一直卡住,最後的1%花了幾個小時都沒跑完,這種情況就很可能是數據傾斜的原因,解決方法要根據具體情況來選擇具體的方案

 

(1)key值發生傾斜,key值包含很多空值或異常值

 賦一個隨機值來分散key,如果不需要也可以過濾掉或不適用該key

select  case  when userid  is  null  then  cast ( rand ( 47 )* 100000  as i nt ) else userid end

 

(2)不同數據類型關聯產生數據傾斜

場景:用戶表中user_id字段爲int,log表中user_id字段既有string類型也有int類型。當按照user_id進行兩個表的Join操作時,默認的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)

 

(3)join 傾斜優化:在map端進行join

  1. set hive.auto.convert.join.noconditionaltask = true;
  2. set hive.auto.convert.join.noconditionaltask.size = 10000000;
  3. set hive.auto.convert.join=true;
  4. set hive.mapjoin.smalltable.filesize=25M;
  5. set hive.optimize.skewjoin.compiletime=true  ---如果是大表和大表join
  6. set hive.optimize.skewjoin=true;

  7. set hive.skewjoin.key=100000;

hive.optimize.skewjoin.compiletimehive.optimize.skewjoin區別爲前者爲編譯時參數,後者爲運行時參數。

skewjoin原理:

  1. 對於skewjoin.key,在執行job時,將它們存入臨時的HDFS目錄。其它數據正常執行

  2. 對傾斜數據開啓map join操作,對非傾斜值採取普通join操作

  3. 將傾斜數據集和非傾斜數據及進行合併操作

開啓skewed key 可以在建表時指定skewed key

create table xxx (key string,value string) skewed by(key);

 

(4)小表與大表關聯

通過mapjoin優化

set hive.auto.convert.join  true ; //將小表刷入內存中  

set hive.mapjoin.smalltable.filesize = 2500000 ;//刷入內存表的大小(字節)  

 

(5)group by 傾斜優化

改變寫法或參數設置

可以將傾斜的數據單獨拿出來處理。最後union回去

參數設置:

set hive.map.aggr=true  --相當於combinner

hive.groupby.mapaggr.checkinterval = 100000

hive.map.aggr.hash.min.reduction=0.5

--預先去100000條數據聚合,如果聚合後的條數/100000>0.5,則不在聚合

set hive.groupby.skewindata=true;

 

(6)不可拆分大文件引發數據傾斜

例如:GZip

可以使用bzip2或zip等支持文件分割的壓縮算法

 

(7)多維聚合引發的數據膨脹

例如:rollup

在Hive中可以通過參數 hive.new.job.grouping.set.cardinality 配置自動控制作業拆解。如果最後拆解的鍵組合大於默認值30,會啓動新的任務處理該值之外的組合。

 

參考:https://blog.csdn.net/s646575997/article/details/51510661

參考:https://blog.csdn.net/hellojoy/article/details/82931827

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