- 操作: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