數據傾斜:
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
- set hive.auto.convert.join.noconditionaltask = true;
- set hive.auto.convert.join.noconditionaltask.size = 10000000;
- set hive.auto.convert.join=true;
- set hive.mapjoin.smalltable.filesize=25M;
- set hive.optimize.skewjoin.compiletime=true ---如果是大表和大表join
set hive.optimize.skewjoin=true;
set hive.skewjoin.key=100000;
hive.optimize.skewjoin.compiletime和hive.optimize.skewjoin區別爲前者爲編譯時參數,後者爲運行時參數。
skewjoin原理:
-
對於skewjoin.key,在執行job時,將它們存入臨時的HDFS目錄。其它數據正常執行
-
對傾斜數據開啓map join操作,對非傾斜值採取普通join操作
-
將傾斜數據集和非傾斜數據及進行合併操作
開啓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