hive數據傾斜

數據傾斜緣由:

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上。

相關文章
相關標籤/搜索