- 操作:join,group by,count distinct
- 原因:key分佈不均勻,人爲的建表疏忽,業務數據特點。
- 症狀:任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成;查看未完成的子任務,可以看到本地讀寫數據量積累非常大,通常超過10GB可以認定爲發生數據傾斜。
- 傾斜度:平均記錄數超過50w且最大記錄數是超過平均記錄數的4倍;最長時長比平均時長超過4分鐘,且最大時長超過平均時長的2倍。
解決思路:
count distinct時,將值爲空的情況單獨處理, 如果是計算 count distinct ,可以不用處理,直接過濾,在最後結果中加1 ;
如果還有其他計算,需要進行group by,可以先將值爲空的記錄單獨處理,再和其他計算結果進行union。
案例:
select count(distinct end_user_id) as user_num from trackinfo;
調整爲:
select cast(count(distinct end_user_id)+1 as bigint) as user_num from trackinfo where end_user_id is not null and end_user_id <> '';
分析:把爲空的過濾掉,在總的count上加1
Multi-Count Distinct
select pid, count(distinct acookie),count(distinct ip),count(wangwangid ip) from ods_p4ppv_ad_d where dt=20140305 group by pid;
必須設置參數:set hive.groupby.skewindata=true