key分佈不均,或者業務數據自己的特性,和sql語句自己就有數據傾斜,建表不規範的問題sql
1.大小表join,其中小表key集中 ,分發到某個或幾個reduce上的數據遠高於平均值apache
2.大表join大表,有特殊值好比0和空值過多 ,這些空值都有一個reduce處理很是慢markdown
3.group by 維度太小,某值過多,處理某值的reduce耗時負載均衡
4.count(distinct) 某特殊值過多,處理此特殊值耗時oop
某個reduce任務長時間在99%和100%,與其餘reduce數據量差別很大,job數多spa
1.sql語句作列裁剪,使兩表join數據量相對變少code
2.group by維度太小orm
hive.map.aggr=true; --map端部分聚合
hive.groupby.skewindata=true; --數據傾斜時,負載均衡,生成兩個 MR JOB
複製代碼
3.大小表join,走map join 小表數據比較小走內存 自動開啓map join內存
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=25000000; --即25M
複製代碼
4.大表join大表把空值變成字符串加上隨機數,把數據分發到不一樣reduce上hadoop
例如:
nvl(字段,concat('hive',rand()))
複製代碼
5.count(distinct xx)有大量特殊值 能夠採用先去重 sum() group by 替換count(distinct)
6.不一樣類型關聯產生的數據傾斜,好比int和string把數據類型轉換成字符類型 case(字段 string)
7.合併小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --執行Map前進行小文件合併
複製代碼
輸出端:經過輸出端小文件合併,減小產生的小文件數量。 --mapd端
set hive.merge.mapfiles=true;
複製代碼
設置:啓用小文件合併 - Map-Only做業,默認true; --reduce端
set hive.merge.mapredfiles=true;
複製代碼
設置:啓用小文件合併 - Map-Reduce做業,默認false;
hive.merge.size.per.task=268534456;
複製代碼
8.減小job數,設置合理的map ,reduce 的task數
數據傾斜主要就是設置合理的map,reduce的task數,將大量數據均勻分發到reduce上。