大数据开发:你真的了解Hadoop数据倾斜吗?

数据倾斜顾名思义就是数据分派不均匀,是对分布式系统或者集群产生的海量数据分配问题。对应大数据行业,处理的数据量可能都是BP或者TP级的,需要多台机器进行集群处理,如果存在分配不合理的情况,就会极大的影响集群任务处理的效率。故数据倾斜,就是由于数据处理任务在任务分配时,对拥有相同处理资源的机器,数据量分配不均造成的集群整体处理效率低下的问题。

Hadoop的数据分配主要有数据分片,数据分区和数据下载,其中分片是按照文件数量和文件大小来分片的,所以不会倾斜,而数据分区Hadoop默认是采用key.hashcode&Integer.MaxValue % numReduceTask来进行分区号分配,后面的分区下载数据也是根据分区号来的,所以如果key的hashcode值不均匀,其分区号分配就会倾斜,数据在进行按分区号归并时就会产生倾斜。

那么接下来我们就详细介绍一下Hadoop的数据倾斜原因以及解决办法。

一、Hadoop数据倾斜表现

Reduce

有一个或者几个Reduce卡在99.9%,一直无法结束。某些Reduce读取的数据量过大,远远大于其他正常的Reduce。

OOM

Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源),如果发生数据倾斜,他会报错OOM(out of memory)。

Kill任务

如果发生数据倾斜,可能会伴随着很多任务被Kill掉。

二、Hadoop数据倾斜原因

在做数据运算的时候,经过Shuffle的时候,所有相同的Key会被拉到一个或者几个Reduce上,容易发生单点问题,导致数据倾斜。

Key分布不均

比如我们处理的数据中,某一个Key的数据量极大,就会导致数据倾斜。

业务数据本身的特性

比如说订单,假如我们在上海或者北京做了一些活动,导致两个地区的下单量激增,其余的不变,这样我们在处理这些数据的时候也会导致数据倾斜。

操作相关

如果数据操作过程中处理不当,产生大量的NULL值,或者不同数据类型之间进行关联,也会产生数据倾斜。

三、Hadoop数据倾斜解决办法

Key导致

hadoop默认的分区方案按Key的HashCode来进行分区,所以数据倾斜主要就是Key名的锅。

采用局部聚合加全局聚合。

第一次在Map阶段对那些导致了数据倾斜的Key 加上1到n的随机前缀,这样本来相同的Key 也会被分到多个Reducer中进行局部聚合,数量就会大大降低。

第二次MapReduce,去掉Key的随机前缀,进行全局聚合。

空值导致

① 在操作数据的时候,过滤掉空值数据。

② 给空值数据加上随机数,避免Key为空。

提前预聚合

提前在Map端进行Combine,减少传输的数据量。

在Mapper加上Combiner相当于提前进行Reduce,即把一个Mapper中的相同Key进行了聚合,减少Shuffle过程中传输的数据量,以及Reducer端的计算量。

增加Reduce并行度

通过JobConf.setNumReduceTasks(int num),增加Reduce的个数,让数据可以更细化,发往更多不同的Reduce,减少数据倾斜的可能性。

自定义分区

Hadoop默认按照Key的Hash值取分区,我们在操作数据的过程中可以手动控制分区方式,人为定义一种分区方式,只需要继承Partitioner,实现getPartition()方法即可。通过Jobconf.setPartitionerClass(class)设置。

四、总结

使Map的输出数据更均匀的分布到Reduce中去,是我们的最终目标。由于Hash算法的局限性,按Key Hash会或多或少的造成数据倾斜。大量经验表明数据倾斜的原因是人为的建表疏忽或业务逻辑可以规避的,所以各位程序猿们多多注意!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值