MapReduce、Hive、Spark中数据倾斜问题解决归纳总结

本文介绍了数据倾斜的概念及其在MapReduce、Hive和Spark中的表现,提供了解决数据倾斜的方法,包括MapReduce中的Combine、自定义分区,Hive中的map端聚合、负载均衡,以及Spark的调整并行度、自定义分区器等策略。
摘要由CSDN通过智能技术生成

数据倾斜是什么

总的来说,你集群运行时发现MR或者Hive卡在99%不动时,或者Spark运行时出现OOM异常(OutOfMemoryError),或者成功执行但就是耗时过久时,既要考虑是否出现了数据倾斜。数据倾斜就是某些key对应的数据分化不均,导致部分reduce处理数据量过大,以至于其他reduce都执行完了它还在运行。

查看web UI、日志文件:

看是否出现map和reduce任务执行时间过久,需要缓存数据集的操作消耗过多的内存资源

map端也是会出现数据倾斜的

MapReduce

减少Reduce数据倾斜
  1. 考虑map端使用Combine提前聚合部分数据

  2. 自定义分区,避免将过大数据量分发到某些reduce

    MR默认分区方式是通过map输出的key的hash值来分发到某些reduce上的,数据分布均匀的话结果还好,但出现数据倾斜就是个问题

    • 可以通过对原始数据进行抽样得到的结果集来预设分区边界值。TotalOrderPartitioner中的范围分区器可以通过预设的分区边界值进行分区。因此它也可以很好地用在矫正数据中的部分键的数据倾斜问题
    • 像Hive那样,在出现数据倾斜的Key上加上随机前缀,先进行第一次局部聚合减少数据量。再去掉前缀进行第二次MapReduce全局聚合
  3. 涉及数据连接时,可以预习考虑在map端连接

  1. 数据大小倾斜的自定义策略

在map端或reduce端的数据大小倾斜都会对缓存造成较大的影响,乃至导致OutOfMemoryError异常。处理这种情况并不容易。可以参考以下方法。

  • 设置mapred.linerecordreader.maxlength来限制RecordReader读取的最大长度。RecordReader在TextInputFormat和KeyValueTextInputFormat类中使用。默认长度没有上限。
  • 通过org.apache.hadoop.contrib.utils.join设置缓存的数据集的记录数上限。在reduce中默认的缓存记录数上限是100条。
  • 考虑使用有损数据结构压缩数据,如Bloom过滤器。

这里我不太理解,没有实际应用过吧。参考:https://www.cnblogs.com/datacloud/p/3601624.html

预判MapReduce中哪些key会出现数据倾斜

在reduce方法中加入记录map输出键的详细情况的功能。

在发现了倾斜数据的存在之后,就很有必要诊断造成数据倾斜的那些键。有一个简便方法就是在代码里实现追踪每个键的最大值。为了减少追踪量,可以设置数据量阀值,只追踪那些数据量大于阀值的键,并输出到日志中。实现代码如下。

public static final String MAX_VALUES = "skew.maxvalues";
private int maxValueThreshold;

@Override
public void configure
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值