数据倾斜?几招把你安排的板板正正的!

简介: 数据倾斜?几招把你安排的板板正正的!

正文


1、数据倾斜表现


1.1 hadoop中的数据倾斜表现


有一个多几个Reduce卡住,卡在99.99%,一直不能结束。

各种container报错OOM

异常的Reducer读写的数据量极大,至少远远超过其它正常的Reducer

伴随着数据倾斜,会出现任务被kill等各种诡异的表现。


1.2 hive中数据倾斜


一般都发生在Sql中group by和join on上,而且和数据逻辑绑定比较深。


1.3 Spark中的数据倾斜


Spark中的数据倾斜,包括Spark Streaming和Spark Sql,表现主要有下面几种:


Executor lost,OOM,Shuffle过程出错;

Driver OOM;

单个Executor执行时间特别久,整体任务卡在某个阶段不能结束;

正常运行的任务突然失败;


2、数据倾斜产生原因


我们以Spark和Hive的使用场景为例。


在做数据运算的时候会涉及到,count distinct、group by、join on等操作,这些都会触发Shuffle动作。一旦触发Shuffle,所有相同key的值就会被拉到一个或几个Reducer节点上,容易发生单点计算问题,导致数据倾斜。


一般来说,数据倾斜原因有以下几方面:


1)key分布不均匀;


2)建表时考虑不周


举一个例子,就说数据默认值的设计吧,假设我们有两张表:


   user(用户信息表):userid,register_ip


   ip(IP表):ip,register_user_cnt


这可能是两个不同的人开发的数据表。如果我们的数据规范不太完善的话,会出现一种情况:


user表中的register_ip字段,如果获取不到这个信息,我们默认为null;


但是在ip表中,我们在统计这个值的时候,为了方便,我们把获取不到ip的用户,统一认为他们的ip为0。


两边其实都没有错的,但是一旦我们做关联了,这个任务会在做关联的阶段,也就是sql的on的阶段卡死。


3)业务数据激增


比如订单场景,我们在某一天在北京和上海两个城市多了强力的推广,结果可能是这两个城市的订单量增长了10000%,其余城市的数据量不变。


然后我们要统计不同城市的订单情况,这样,一做group操作,可能直接就数据倾斜了。


3、解决数据倾斜思路


很多数据倾斜的问题,都可以用和平台无关的方式解决,比如更好的数据预处理,异常值的过滤等。因此,解决数据倾斜的重点在于对数据设计和业务的理解,这两个搞清楚了,数据倾斜就解决了大部分了。


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都自带了很多的参数和机制来调节数据倾斜,合理利用它们就能解决大部分问题。


4)从业务和数据上解决数据倾斜


很多数据倾斜都是在数据的使用上造成的。我们举几个场景,并分别给出它们的解决方案。


一个原则:尽早过滤每个阶段的数据量。


数据有损的方法:找到异常数据,比如ip为0的数据,过滤掉。


数据无损的方法:对分布不均匀的数据,单独计算。


hash法:先对key做一层hash,先将数据随机打散让它的并行度变大,再汇聚。


数据预处理:就是先做一层数据质量处理,类似于数据仓库维度建模时,底层先处理数据质量。


相关文章
L2-028 秀恩爱分得快 (25 分)
L2-028 秀恩爱分得快 (25 分)
125 0
|
传感器 存储 数据安全/隐私保护
基于PLC十字路口交通灯控制(可计算车流量、调整时间等)课程设计毕业设计
基于PLC十字路口交通灯控制(可计算车流量、调整时间等)课程设计毕业设计
338 0
基于PLC十字路口交通灯控制(可计算车流量、调整时间等)课程设计毕业设计
|
存储
L2-028 秀恩爱分得快 (25 分)(模拟)
L2-028 秀恩爱分得快 (25 分)(模拟)
164 0
|
JavaScript
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
286 0
小明特别喜欢打扑克牌,除了喜欢斗地主和德州扑克之外,还喜欢一种叫桥牌的游戏,桥牌的具体规则相当复杂,有叫牌、打牌和计分三个阶段,还有不断变化的局况,局况可能影响叫牌打牌策略。但是小明暂时不关心这一些,
|
机器学习/深度学习 数据采集 SQL
学术加油站|学习型基数估计:设计方式的探索与比较
今天分享的这篇论文是李国良教授的团队今年发表的一篇综述,主要内容是从现有的学习型基数估计论文中抽象出 3 种统一工作流程,并对各个种类的基数估计方法中选择效果明显的几种作为代表,从多个方面进行全面的测试。
501 0
学术加油站|学习型基数估计:设计方式的探索与比较
|
机器学习/深度学习 算法 调度
【优化调度】基于帝国企鹅算法求解多扇区航空调度问题附matlab代码
【优化调度】基于帝国企鹅算法求解多扇区航空调度问题附matlab代码
|
存储 机器学习/深度学习 移动开发
冰与火之歌:「时间」与「空间」复杂度 | 算法必看系列三十六
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间; 反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。
冰与火之歌:「时间」与「空间」复杂度 | 算法必看系列三十六
火箭发射:点击率预估界的“神算子”是如何炼成的?
响应时间直接决定在线响应系统的效果和用户体验。比如在线展示广告系统中,针对一个用户,需要在几ms内,对上百个候选广告的点击率进行预估。因此,如何在严苛的响应时间内,提高模型的在线预测效果,是工业界面临的一个巨大问题。
952 0