key 分布不均勻
業務資料本身的特性
建表考慮不周全
某些 hql 語句本身就存在資料傾斜
1.空值產生的資料傾斜
在日誌中,常會有資訊丟失的問題,比如日誌中的 user_id,如果取其中的 user_id 和使用者表中的 user_id 相關聯,就會碰到資料傾斜的問題。
解決方案 1:user_id 為空的不參與關聯
select * from log a join user b on a.user_id is not null and a.user_id = b.user_id
解決方案 2賦予空值新的 key 值
select * from log a left outer join user b on
case when a.user_id is null then concat
('hive'
,rand()
)else a.user_id end = b.user_id
把空值的 key 變成乙個字串加上乙個隨機數,就能把造成資料傾斜的 資料分到不同的 reduce 上解決資料傾斜的問題。
2.不同資料型別關聯產生資料傾斜
使用者表中 user_id 欄位為 int,log 表中 user_id 為既有 string 也有 int 的型別, 當按照兩個表的 user_id 進行 join 操作的時候,預設的 hash 操作會按照 int 型別的 id 進 行分配,這樣就會導致所有的 string 型別的 id 就被分到同乙個 reducer 當中
**解決方案 ** 轉換為相同資料型別
select * from user a left outer join log b on b.user_id =
cast
(a.user_id as string)
3.大小表關聯查詢產生資料傾斜
map join 概念:將其中做連線的小表(全量資料)分發到所有 maptask 端進行 join,從 而避免了 reducetask,前提要求是記憶體足以裝下該全量資料
在記憶體允許的條件下使用 map join 比直接使用 mapreduce 效率還高些, 當然這只限於做 join 查詢的時候。
在 hive 中,直接提供了能夠在 hql 語句指定該次查詢使用 map join,map join 的用法是 在查詢/子查詢的select關鍵字後面新增/*+ mapjoin(tablelist) */提示優化器轉化為map join
select /* +mapjoin(a) */ a.id aid, name, age from a join b on a.id = b.id;
在 hive0.11 版本以後會自動開啟 map join 優化,由兩個引數控制:
set hive.auto.convert.join=
true
;//設定 mapjoin 優化自動開啟
set hive.mapjoin.smalltable.filesize=
25000000
//設定小表不超過多大時開啟 mapjoin 優化
4.小檔案過多:
當出現小檔案過多,需要合併小檔案。可以通過set hive.merge.mapfiles=true來解決。
set hive.map.aggr=true; //map端部分聚合,相當於combiner,可以減小壓力(預設開啟)
開啟資料傾斜時負載均衡
set hive.groupby.skewindata=true(預設關閉);//有資料傾斜的時候進行負載均衡,當選項設定為 true,生成的查詢計畫會有兩個 mr job。第乙個 mr job 中,map 的輸出結果集合會隨機分布到 reduce 中,每個 reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 group by key 有可能被分發到不同的 reduce 中,從而達到負載均衡的目的;第二個 mr job 再根據預處理的資料結果按照 group by key 分布到 reduce 中(這個過程可以保證相同的 group by key 被分布到同乙個 reduce 中),最後完成最終的聚合操作。
5.當hiveql中包含count(distinct)時
採用 sum() group by 的方式來替換 count(distinct)完成計算。
Hive資料傾斜
hive資料傾斜問題 傾斜原因 map輸出資料按key hash分配到reduce中,由於key分布不均勻 或者業務資料本身的特點。等原因造成的reduce上的資料量差異過大。1.1 key分布不均勻 1.2 業務資料本身的特性 1.3 sql語句造成資料傾斜 解決方案 1 引數調節 hive.ma...
HIVE 資料傾斜
解決資料傾斜,歸根結底是使map的輸出資料更均勻的分布到reduce中去。1 join 1 其中乙個表較小,但是key集中。分發到某乙個或幾個reduce上的資料遠高於平均值 2 大表與大表,但是分桶的判斷欄位0值或空值過多。這些空值都由乙個reduce處理,非常慢 2 group by group...
hive 資料傾斜介紹
hive在跑資料時經常會出現資料傾斜的情況,使的作業經常reduce完成在99 後一直卡住,最後的 花了幾個小時都沒跑完,這種情況就很可能是資料傾斜的原因,解決方法要根據具體情況來選擇具體的方案 這種情況可以對異常值賦乙個隨機值來分散key 如 selectuserid name fromuser ...