hive資料傾斜
1. join時產生資料傾斜
1.1 小表join大表
使用mapjoin
1.2 大表join大表
1.2.1 key為空值造成的影響
空值太多join時,會把所有key為空值的資料發送到同一個reduce中,發生資料傾斜
解決方法:
- 空值不重要的情況,先把空值過濾掉,在進行join
- 空值不能過濾,使用case when 對空值附上隨機值,然后進行join,這樣會把所有key為空值的資料發送到不同的reduce中去處理.
1.2.2 熱點key
可以將熱點資料和非熱點資料分別進行處理,最后再合并到一起.
2. group by 產生資料傾斜
2.1 開啟資料傾斜的負載均衡
默認為false,改為true
set hive.groupby.skewindata=true;
任務執行的時候會有兩個mr,
第一個mr任務會把map輸出的結果集合隨機分配到所有reduce中,做部分聚合;
第二個mr任務會根據預處理的結果按照 group by key 分布到reduce中,完成最終的聚合操作.
2.2 引入亂數
先給熱點key添加亂數前綴,然后聚合一次,然后把亂數去了再做一次聚合.
原始sql:
select uid,count(1) as ct from user group by uid;
找到傾斜的key:
select
uid,
count(1) as ct
from user
group by uid distribute by uid sort by ct desc limit 10;
修改后的sql:
select
uid,
sum(rt) as cts --去除亂數再做一次聚合
from(
select
uid,
round(rand()*1000) as rd,
count(1) as rt --添加亂數前綴后預聚合
group by uid,round(rand()*1000)
) tmp
group by uid
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/235449.html
標籤:其他
