Hadoop详解(八):MapReduce深度分析

1. MapReduce数据流向分析

MapReduce是一种并行数据处理框架,首先我们需要关注系统中数据流向问题,也就是从输入到输出过程中的数据传输问题。

在这里插入图片描述

1)从HDFS到Mpper节点输入文件。在一般情况下,存储数据的节点是Mapper运行的节点,不需要在节点之间进行数据传输,也就是尽量让存储靠近计算。但是由于用户的数据文件往往不是均衡的分布在整个集群中,则MapReduce的计算槽位资源却是均衡的分布在整个集群中的,因此某些计算节点就需要从数据存储节点获取数据到自己的计算节点,这样就会存在数据从HDFS上的存储节点到另一个计算节点的数据传输,为了提高集群资源的利用率,Hadoop会从距离计算节点最近的数据副本进行数据传输。

2)Mapper输出到内存缓冲区。Mapper的输出并不是直接写入本地文件系统,而是先写入内存缓冲区。

3)当缓冲区达到一定的阈值时就将缓冲区中的数据以临时文件的形式写入本地磁盘。默认的缓冲区大小是100MB,溢写比例默认是0.8 (可通过spill.percent参数来调节)

当达到阈值时,溢写线程就会启动并锁定这80MB内存执行溢写过程,这一过程称为spill。溢写线程启动的同时还会对这80MB的内存数据依据key的序列化字节做排序。当整个map任务结束后,会对这个map任务产生的所有临时文件进行合并,并产生最终的输出文件。

需要注意:在写入内存缓冲区的同时执行Partition分区。

如果用户作业设置了Combiner,那么在溢写到磁盘之前会对Map输出的键值对调用Combiner归约,这样可以减少溢写到本地磁盘文件的数据量。

4)从Mapper端的本地文件系统流入Reduce端,也就是 Reduce中的Shuffle阶段 分三种情况:

  1. 多个Reduce,需要将Mapper输出中的分区Region文件远程复制到相应的Reduce节点,如4-1
  2. Mapper节点所在机器有Reduce槽位,则会直接写入本机Reduce缓冲区,如4-2
  3. 本机的Reduce还会接受其他Mapper输出的分区Region文件,如4-3

需要注意的是Reduce端的这个内存缓冲区也有一个阈值,当相应的Region文件大于这个阈值便写入磁盘。

5)从Reduce端内存缓冲区流向本地磁盘的过程就是Reduce中Merge和Sort阶段。Merge分为内存文件合并和磁盘文件合并,同时还会以key为键排序,最终生成已经对相同key的value进行聚集并排序好的输出文件。

6)流向Reduce函数进行归约处理

7)写入HDFS中,生成输出文件。

在这里插入图片描述

2. MapTask实现分析

MapTask的总逻辑流程,包括以下几个阶段:

2.1 Read阶段

首先通过taskContext.getInputFormatClass()得到用户指定的InputFormatClass来创建InputFormat对象实例;其次,创建InputSplit对象,这个对象负责对文件进行数据块的逻辑切分;最后,创建RecordReader对象。InputFormat对象会提供getSplit()重要方法,通过getSplit()将输入文件切分成若干个逻辑InputSplit实例对象会把InputSplit提供的输入文件转化为Mapper需要的keys/vaule键值对集合形式。

2.2 Map阶段

对输入的键值对调用用户编写的Map函数进行处理,输出<key,value>键值对

2.3 Collector和Partitioner阶段

收集Mapper输出,在OutputCollector函数内部对键值对进行Partitioner分区,以便确定相应的Reducer处理,这个阶段将最终的键值对集合输出到内存缓冲区。

2.4 Spill阶段

包含Sort和Combiner阶段,当内存缓冲区达到阈值后写入本地磁盘,在这个阶段会对Mapper的输出键值对进行Sort排序,如果设置了Combiner会执行Combiner函数

Spill阶段有两个重要的逻辑,Sort和Combiner(如果用户设置了Combiner)。

在这里插入图片描述

每个mapTask都有一个内存的环形缓存区(默认是100MB),存储着map的输出结果。当缓存区块满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘(Spill)。溢写时由单线程来完成的,不影响往缓冲区写map结果的线程(spill.percent,默认是0.8)

2.5 Merge阶段

对Spill阶段在本地磁盘生成的小文件进行多次合并,最终生成一个大文件。

(3),(4),(5)也称Map端的Shuffle

3. ReduceTask 实现分析

在这里插入图片描述

ReduceTask的总逻辑流程,包括以下几个阶段:

3.1 Shuffle阶段

这个阶段就是Reduce中的Copy阶段,运行Reducer的TaskTracker需要从各个Mapper节点远程复制属于自己处理的一段数据。

Mapper的输出是写入本地磁盘的,并且是按照partition分区号进行组织的,Reduce的输入便是分布在集群中多个Mapper任务输出数据中同一partition段的数据,Map任务可能会在不同的时间内完成,只要其中一个Map任务完成了,ReduceTask就开始复制它的数据了。

3.2 Merge阶段

由于执行Shuffle阶段时会从各个Mapper节点复制很多同一partition段的数据,因此需要进行多次合并,以防止ReduceTask节点上内存使用过多或小文件过多。

在Shuffle阶段中启动数据复制线程MapOutputCopier后就开始进行Merge阶段。Merge包括两种情况:基于内存的合并和基于磁盘的合并,其分别对应的线程为InMemFSMergeTheread和LocalFSMerge。

在这里插入图片描述

3.3 Sort阶段

虽然每个Mapper的输出是按照key排序好的,但是经过Shuffle和Merge阶段后并不是统一有序的,因此还需要在Reduce端进行多轮归并排序。

3.4 Reduce 阶段

Reduce的输入要求是按照key排序的,因此只有在Sort阶段执行完成之后才可以对数据调用用户编写的Reduce类进行归约处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值