这可能是两个不同的人开发的数据表。如果我们的数据规范不太完善的话,会出现一种情况:
user表中的register_ip字段,如果获取不到这个信息,我们默认为null;
但是在ip表中,我们在统计这个值的时候,为了方便,我们把获取不到ip的用户,统一认为他们的ip为0。
两边其实都没有错的,但是一旦我们做关联了,这个任务会在做关联的阶段,也就是sql的on的阶段卡死。
3**)业务数据激增**
比如订单场景,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两个城市的订单量增长了10000%,其余城市的数据量不变。
然后我们要统计不同城市的订单情况,这样,一做group操作,可能直接就数据倾斜了。
很多数据倾斜的问题,都可以用和平台无关的方式解决,比如更好的数据预处理,异常值的过滤等。因此,解决数据倾斜的重点在于对数据设计和业务的理解,这两个搞清楚了,数据倾斜就解决了大部分了。
1**)业务逻辑**
我们从业务逻辑的层面上来优化数据倾斜,比如上面的两个城市做推广活动导致那两个城市数据量激增的例子,我们可以单独对这两个城市来做count,单独做时可用两次MR,第一次打散计算,第二次再最终聚合计算。完成后和其它城市做整合。
2**)程序层面**
比如说在Hive中,经常遇到count(distinct)操作,这样会导致最终只有一个Reduce任务。
我们可以先group by,再在外面包一层count,就可以了。比如计算按用户名去重后的总用户量:
(1)优化前
只有一个reduce,先去重再count负担比较大: select name,count(distinct name)from user;
(2)优化后
// 设置该任务的每个job的reducer个数为3个。Hive默认-1,自动推断。
set mapred.reduce.tasks=3;
// 启动两个job,一个负责子查询(可以有多个reduce),另一个负责count(1):
select count(1) from (select name from user group by name) tmp;
3**)调参方面**
Hadoop和Spark都自带了很多的参数和机制来调节数据倾斜,合理利用它们就能解决大部分问题。
详见:
1、hive 参数设置大全:https://blog.youkuaiyun.com/weixin_39032019/article/details/111912916
2、spark-submit 参数设置:https://blog.youkuaiyun.com/weixin_39032019/article/details/103371674
3、kudu 参数设置:https://blog.youkuaiyun.com/weixin_39032019/article/details/110534549
4**)从业务和数据上解决数据倾斜**
很多数据倾斜都是在数据的使用上造成的。我们举几个场景,并分别给出它们的解决方案。
-
数据有损的方法:找到异常数据,比如ip为0的数据,过滤掉
-
数据无损的方法:对分布不均匀的数据,单独计算
-
hash法:先对key做一层hash,先将数据随机打散让它的并行度变大,再汇聚
-
数据预处理:就是先做一层数据质量处理,类似于数据仓库维度建模时,底层先处理数据质量
【推荐阅读】
★ 数据仓库专栏:数仓方法论、实战经验、面试真题(https://blog.youkuaiyun.com/weixin_39032019/category_8871528.html)
★ Python专栏:Python黑科技:爬虫、算法、小工具(https://blog.youkuaiyun.com/weixin_39032019/category_8974792.html)
★ 大数据面试专栏:面试真题、开发经验、调优策略(https://blog.youkuaiyun.com/weixin_39032019/category_11048805.html)
【抽奖环节】
抽奖规则:只要评论数过30,随机抽取一名幸运读者,现金红包奖励 66.66 元!!
开奖方式:采用random函数法,随机从评论区,摇出页数和序号。桥哥会私信联系你~
开奖时间:从文章发布时间起,第三天下午开奖
我是桥哥,专注分享大数据知识体系 & Python黑科技。
求点赞、求评论、求收藏!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
需要这份系统化资料的朋友,可以戳这里获取](https://bbs.youkuaiyun.com/topics/618545628)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!