【Hadoop】Hadoop生态系列之MapReduce Shuffle概述及常见问题

上一篇:Hadoop生态系列之InputForamt.class与OutputFormat.class分析

MapReduce Shuffle

定义

MapReduce中,mapper 阶段处理的数据如何传递给 reducer 阶段,是MapReduce框架中最关键的一个流程,这个流程就叫Shuffle(也称为“洗牌”)。总体来说shuffle核心流程主要包括以下几个方面:数据分区、排序、局部聚合/Combiner、缓冲区、溢写、抓取/Fetch、归并排序等。

在这里插入图片描述

MapReduce Shuffle常见问题

MapReduce能否实现全局排序?

默认情况下MapReduce是无法实现全局有序的,因为底层MapReduce使用的是HashPartitioner实现,仅仅只能保证数据分区内部的数据以key的自然顺序排列,因此无法实现全局有序。但是可以有一下思路完成全局排序:

  • 设置NumReduceTask的个数为1,这样会导致所有的数据落入到同一个分区,即可实现全排序,但是只适用于小批量数据集
  • 自定义分区策略让数据按照区间分区,不按照hash策略,此时只需要保证区间之间有序即可实现全局有序。但是这种做法会出现区间数据分布不均匀,导致计算过程中出现数据倾斜。
  • 使用Hadoop提供的TotalOrderPartitioner,先对目标进行采样,然后推算出分区区间。

参考:https://blog.csdn.net/lalaguozhe/article/details/9211919

如何干预MapReduce的分区策略?

一般来说在实际的开发中,很少去干预分区策略,因为基于大数据首先要考虑的是数据的均匀分布,防止数据倾斜。因此Hash的散列往往是最佳的选择,如果需要覆盖原有分区,可以调用:

job.setPartitionerClass(分区实现类信息即可)
public class CustomHashPartitioner<K, V> extends Partitioner<K, V> {

  public int getPartition(K key, V value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}
如何解决在MapReduce计算过程中的数据倾斜问题?

举个栗子: 统计亚洲国家人口,以中国、日本为例。自然会使用国家作为key、公民信息作为value。在进行MapReduce计算的时候,中国的公民因为国籍都是China自然会落入到一个分区中。这样就出现数据严重倾斜。
在这里插入图片描述

MapReduce中Map、Reduce并行度是靠什么决定的?

Map端并行度是通过计算任务切片决定的,Reduce端是通过job.setNumReduceTask(n)

MapReduce调优策略
  1. 避免小文件计算,线下合并成大文件之后,在进行MapReduce分析或者CombineTextInputFormat。

  2. 调整环状缓冲区的参数,减少Map任务的IO操作,不能无限制调大,还要考虑到系统GC问题。

  3. 开启Map压缩,将溢写文件压缩成GZIP格式,减少ReduceShuffle过程中的网络带宽占用,消耗CPU为代价

    conf.setBoolean("mapreduce.map.output.compress",true);
    conf.setClass("mapreduce.map.output.compress.codec",
    GzipCodec.class, CompressionCodec.class); ```
    
    
  4. 如果条件允许,我们可以开启Map端预处理机制,提前在Map端执行Reduce逻辑,进行局部计算,这样既可极大提升计算性能,但是这种优化手段并不是所有场景都适合。例如:求均值,这种场景就不适合在Map端执行Reduce逻辑。

    • Combiner/Reduce的输入和输出类型必须一致,也就是说预计算逻辑不可以更改Map端输出类型/Reduce端输入类型。
    • 不可以改变原有的业务逻辑,比如 求平均值,虽然类型兼容但是业务计算不正确。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SYJuriz1-1601474947597)(F:/BigData/hadoop生态系列课程/assets/image-20200930142652073.png)]
      优点: 减少Key数量,节省排序所占用内存空间,极大削减了在ReduceShuffle时候的数据下载量,节省带宽。
  5. 适当的调整NodeManager管理的资源数

yarn.nodemanager.resource.memory-mb=32G
yarn.nodemanager.resource.cpu-vcores = 16

或者开启硬件资源监测

yarn.nodemanager.resource.detect-hardware-capabilities=true
  1. 如果顺序执行多个小任务,我们可以考虑使用JVM重用机制,可以使用一个JVM顺序执行多个任务,无需重启新的jvm。
mapreduce.job.jvm.numtasks=2

下一篇:Hadoop生态系列之搭建HadoopHA集群

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@是小白吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值