MapReduce的优化组件和Shuffle阶段

1、Combiner类

Combiner类是用来优化MapReduce的,它可以提高MapReduce的运行效率。在MapReduce作业运行过程中,通常每一个Map都会产生大量的本地输出,Combiner的作用就是在Map端对输出结果先做一次合并,以减少传输到Reduce端的数据量。
Combiner并没有自己的基类,而是继承Reduce,它们对外的功能是一样的,只是使用的位置和使用的上下文不太一样,Combiner操作发生在Map端。Combiner并不会影响原有的逻辑,也就是不影响最后的运行结果,它影响的只是效率。

2、Partitioner类

前面提到使用Combiner类是可以提升MapReduce作业的执行效率,本次介绍MapReduce的另一个优化组件–>Partitioner类。
Partitioner的功能是在Map端对key进行分区。Map端最终处理的键值对(<key,value>对)需要发送到Reduce端去合并,合并的时候,相同分区的键值对(<key,value>对)会分配到同一个Reduce上,这个分配过程就是由Partitioner(分区)决定的。
MapReduce默认的Partitioner是HashPartitioner。其计算方法如下:

  1. Partitioner先计算key的散列值(通常是MD5值)。
  2. 通过Reduce个数执行取模运算:Key.hashCode%numReduce。

3、Shuffle阶段

它的大致处理过程就是把Map任务的输出结果有效地传送到Reduce端,也可以理解为Shuffle就是描述数据从Map任务输出到Reduce任务输入的这段过程。Shuffle阶段包括Map端的Shuffle和Reduce段的Shuffle。

3.1、Map端的Shuffle

MapReduce提交作业时,Map端的Shuffle过程如下:
(1)拆分。InputSplit将作业拆分成若干个Map任务。
(2)执行自定义map()方法。Map过程开始处理,Mapper任务会接受输入分片,通过不断地调用map()方法对数据进行处理。处理完毕后,转换为新的<key,value>对输出。
(3)缓存。Map端的输出结果先写到内存中的一个缓冲区。
(4)分区(Partitioner)。在内存中进行分区,默认是HashPartitioner,目的是将Map端的结果分给不同的Reduce。
(5)排序。分区结束后,针对不同分区的数据,会按照key进行排序,要求key必须实现WritableComparable接口。
(6)分组。排序后的数据按key进行分组,将相同key的<key,value>对分到一个组中,最终,每个分组将会调用一次reduce()方法。
(7)合并(Combiner)。排序分组后,相同key的数据组成一个列表,如果设置了Combiner,就合并数据,可以减少写入磁盘的记录数。
(8)溢写(spill)。当内存中的数据达到一个特定的阈值时,系统会自动将记录溢写到磁盘中,形成一个spill文件。
(9)合并文件(Merge)。Map过程结束时会把溢写出来的多个文件合并一个。Merge过程最多将10个(默认)文件同时合并成一个文件,多余的文件将分多次合并。
经过上面的流程,Map端Shuffle过程完毕,数据都有序地存放在磁盘里,等待Reduce去拉取数据。

3.2、Reduce端的Shuffle

Reduce在执行前,都是重复地拉取数据合并,Reduce端的Shuffle过程如下:
(1)复制过程。Reduce端启动一些数据复制线程(Fetcher),通过HTTP方式请求获取Map任务的输出文件。
(2)合并阶段。这里的合并与Map端的合并类似,只是处理的数据是从不同Map端复制过来的。
(3)Reduce的输入文件。经过不断地合并后,生成一个最终文件,当Reduce的输入文件已定,整个Shuffle过程才最终结束,然后就由Reduce执行,把结果放到HDFS上。

ps:上文提到MapReduce核心思想及其运行流程介绍
ps:望多多支持,后续更新中。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值