**:
發生資料傾斜
時,通常的
現象是: 資料
傾斜一般是由於**中的
join
或group by
或distinct
的key
分布不均
導致的,大量
經驗表明資料
傾斜的原因是人
為的建表疏忽或
業務可以
規避的。如果確
認業務需要
這樣傾斜的邏輯.
select /*+mapjoin(b)*/ * from a join b on a.id =b.id
將會把join
轉換為mapjoin
,且將b表作為
小表處理。
一、隨機函式解決傾斜
原始sql:
insertoverwrite table t_aa_click_log partition (pt=』$』)
selecta.*
from(select * from t_aa_click_log1
wherept=』$』
)aleftouter join
(select* from t_aa_pv_info_log
wherept=』$』) b
ona.pvid=b.pvid;
發現大量時間花費在reduce99%~100%這最後一步上,約佔總時長20分鐘的一半,
用以下sql檢查下資料分布:
select*
from(
selectpvid,count(1) cnt
fromt_aa_click_log1
wherept=』$』
groupby pvid) t
orderby cnt desc
limit50;
發現pvid=』na』的佔比最高,有100多萬,而其他最多的也只有幾十條,證實資料傾斜。
利用隨機函式,將pvid=』na』的資料隨機分布到不同的reduce中:
insertoverwrite table t_aa_click_log partition (pt=』$』)
selecta.*
from(select * from t_aa_click_log1
wherept=』$』
)aleftouter join
(select* from t_aa_pv_info_log
wherept=』$』) b
–如果pvid長度<=2,包含pvid=na或-1 等多種異常值,即用隨機函式疊加處理,因為異常值本來就關聯不到,所以加上隨機函式對結果沒有影響
oncase when length(a.pvid)<=2 then concat(a.pvid,rand()) else a.pvid end =b.pvid;
問題解決。
二、mapjoin 結合 unionall
原始sql:
from
(select * from t_aa_pvid_ctr_hour_js_mes1
) aleft outer join
(select * fromt_qd_cmfu_book_info_mes
) c速度很慢,老辦法,先查下資料分布。
select *
from
fromt_aa_pvid_ctr_hour_js_mes1
order by cnt desc
limit 50;
資料分布如下:
na617370129 2
118293314 1
40673814 d
20151236 b
1846306 s
1124246 5
675240 8
642231 6
611104 t
596973 4
579473 3
489516 7
475999 9
373395
107580
10508
解決方案:
(select * fromt_aa_pvid_ctr_hour_js_mes1
) aleft outer join
(select * fromt_qd_cmfu_book_info_mes
where cast(book_id asint)>9) c
union all
select /*+ mapjoin(c)*/
(select * fromt_aa_pvid_ctr_hour_js_mes1
left outer join
(select * fromt_qd_cmfu_book_info_mes
where cast(book_id asint)<=9) c
all 放到一起。
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...
Hive資料傾斜解決方法總結
資料傾斜是進行大資料計算時最經常遇到的問題之一。當我們在執行hiveql或者執行mapreduce作業時候,如果遇到一直卡在map100 reduce99 一般就是遇到了資料傾斜的問題。資料傾斜其實是進行分布式計算的時候,某些節點的計算能力比較強或者需要計算的資料比較少,早早執行完了,某些節點計算的...