数据倾斜及一些解决方法

本文介绍了数据倾斜的概念及其在大数据处理中的影响,特别是在Spark和Hive中的表现。针对Spark,提出了两阶段聚合的解决方案,通过随机数分散key来平衡数据分布。而在Hive中,提出了一系列解决数据倾斜的策略,包括设置参数、优化SQL语句和利用mapjoin等。这些方法旨在改善数据分布不均,提高计算效率。

一、数据倾斜原理

做大数据开发,很有可能会遇到数据倾斜的问题,要想解决数据倾斜,首先要理解什么是数据倾斜,以及产生数据倾斜的原因。

数据倾斜主要是指:主要就是数据在每个节点上的分配不均,导致个别节点处理速度很慢,使得程序迟迟不能运行结束。主要表现为:在mapreduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key中的的条数比其他key要多很多,这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。如何将数据均匀的分配到各个reduce节点中,就是解决数据倾斜的根本所在

二、Spark中数据倾斜解决

以下针对spark具体计算场景,给出数据倾斜解决方案:
场 景当RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,产生数据倾斜。
出现数据倾斜原因:
在上述分组场景中,具有相同的key的数据就会被分配到同一个组当中,从而分配到同一分区。如果某些相同key的数据量非常大,而其他是key的数据量相对较小,此时就可能产生比较严重的数据倾斜。
本方案通过两个阶段聚合:
阶段一:
先给每个key都打上一个随机数,比如10以内的随机数,比如(spark,1) (spark, 1) (spark, 1) (spark, 1),就会变成(1_spark, 1) (1_spark, 1) (2_spark, 1) (2_spark, 1)。打上随机数以后,原先一样的key就变成不一样的了。然后对数据进行reduceByKey等聚合操作,局部聚合结果变成了(1_spark, 2) (2_spark, 2)。
阶段二:
基于阶段一局部聚合的数据,将各个key的前缀给去掉,就会变成(spark,2)(spark,2),再次进行全局聚合操作,得到最终结果,比如(spark, 4)。

三、Hive中数据倾斜

1.group by导致数据倾斜

(1)、设置hive.map.aggr:默认为true,在map端做聚合,推荐使用

(2)、设置hive.groupby.skewindata:reduce操作的时候,相同key值并不是都给同一个reduce,而是随机分发到各个reduece做聚合。这个参数其实跟hive.map.aggr做的类似,只是在reduce端做,要额外启动一轮job,不推荐使用

(3)、优化sql语句

有个t表,数据量很大,假如字段a代表的性别,那么只有2个值,对a进行group by操作,所有聚合运行将会落在两个节点上。优化方法,先group by a b,b需要一个比较分散的值,比如班级或者年级,得到一个较小规模的中间结果数据,再对中间结果group by a。

改写前

select a, count(distinct b) as c from t group by a;

改写后

select a, count(*) as c from (select a, b from t group by a, b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值