1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Hive数据倾斜解决要点

Hive数据倾斜解决要点

时间:2020-11-15 23:53:16

相关推荐

Hive数据倾斜解决要点

数据倾斜的外在表现是执行时间超长。一般发生在group by或者join操作上,表现为一个或几个reduce一直没办法做完,原因是key分布不均,某个或某几个key的数据特别大。这种情况下,另外有一个解释:数据倾斜。 Group by : 若group by聚合时,有count(distinct)或sum(distinct),有时会出现数据倾斜的现象。处理办法有两种:a.检查数据是否异常,去除不合理的数据; 特别留意关联的key 里面有大量0、空值,数据为脏数据;做过滤 ,然后再distinct输出b.打开数据倾斜开关。 参数设置:Set hive.groupby.skewindata = true; %在问题SQL之前执行参数设置:Set hive.groupby.skewindata = false; %在问题SQL之后执行查询计划会生成两个MR Job,其中在第一个MR Job中,Map的输出结果会随机分配到Reduce端,每个Reduce做部分聚合计算,然后输出结果,从而达到负载均衡的目的;在第二MR Job中,根据预处理的数据结果按照分组 Key 将数据分配到相应的Reduce任务中,完成最终的聚合计算。特殊情况特殊处理: 在业务逻辑优化效果的不大和无法使用优化开关优化的情况下,有些时候是可以将倾斜的数据单独拿出来处理,最后再union all回去的。连接条件中有or这种情况,可以考虑使用join + union all戒者in等方式来改写join : a.检查数据是否有异常,比如,连接key的某些值重复度超高,或者连接key中存在null值(这种情况非常常见);检查是否有数据倾斜的方法:例如以下SQL: select distinct t2.qqno from t1 join t2 on t1.fromqq = t2.toqq用下面这种SQL就可以发现问题了(叧写一个,另外一个就不赘述了): select count(*) c, toqqfrom t2group by toqqorder by c desclimit 50;上面的这个SQL虽然简单,却被我用来为很多童靴解决了问题。请一定要牢记!b.连接是否能使用map join,当需要join的表有一个小表时就很适合用内存计算来完。map join可以很好的解决连接时的数据倾斜。c.数据去重。 很多时候迚行join的两个表中有一个表应该是distinct的,但实际的数据并非distinct的,这个时候应该做一次select distinct操作。设置reduce个数, 通过设置reduce任务数使得reduce key分散,提高并行度来加速执行:set mapred.reduce.tasks=N; //执行语句之前set mapred.reduce.tasks=-1; //执行语句之后恢复原状注意:请合理设置N的大小!将数据倾斜的key随机化 将空值key转换成一个字符串加上随机数,从而将倾斜的数据分到不同的Reduce任务上select * from table1 a left join table2 bon case when a.openid is null then concat('random',rand()) else a.openid end = b.openid;

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。