MapReduce的过程

在MapReduce的过程中,一个作业被分成map和reduce计算两个阶段,他们分别由一个或者多个map任务和reduce任务组成,如下图所示,一个MapReduce作业从数据的流向可以被切分为Map任务和Reduce任务。Reduce任务默认在Map任务数量完成5%后才开始启动。
这里写图片描述

1. input
如果使用HDFS上的文件作为输入,mr计算框架会首先用InputFormat类的子类FileInputFormat类讲作为输入的文件切分成输入分片(InputSplit)。
InputSplit只是逻辑上对输入的数据进行切分,并不会将文件在磁盘上切分成分片进行存储。其只记录了分片的元数据节点信息,例如起始位置,长度以及所在的节点列表等。FileInputFormat类使用computeSplitSize方法计算InputSplit的大小:

protected long computeSplitSize(long blockSize, long minSize, long maxSize)
{
    return Math.max(minSize,Math.max(maxSize,blockSize));
}

minSize默认为1,maxSize默认为9223372036854775807,所以,如果使用默认配置,分片的大小就和数据块的大小相等(64MB)。应尽量使分片的大小和块的大小相同以提高map任务计算的数据本地性。
当输入文件被切分为分片之后,由FileInputFormat的子类的createRecordReader方法将InputSplit解析成键值对,默认是将行号作为键,解析出来的键值对将用来作为map函数的输入。
2. map及中间结果的输出

InputSplit将解析好的键值对交给map函数处理,处理后的中间结果会写到本地磁盘,在刷写磁盘的过程中,还做了partition(分区)和sort(排序)的操作。

这里写图片描述
每个map任务都有一个内存缓冲区,用于存储map函数的输出,默认大小为100M,如果达到阈值,一个后台线程会将缓冲区的内容溢写进磁盘,在写磁盘过程中,map函数的输出会继续被写到缓冲区,如果在此期间缓冲区被填满,map会阻塞知道写磁盘过程完成。
在写磁盘之前,线程会默认按照键来进行分区,在每个分区中,后台线程按键进行内排序。
一旦内存缓冲区达到溢出的阈值,就会新建一个溢出写文件,因此在map任务写完其最后一个输出记录之后,会有若干个溢出写文件。在map任务完成之前,溢出写文件会被合并成一个已分区且已排序的输出文件作为map输出的中间结果,也是map任务的输出结果。
3. shuffle

shuffle,也叫数据混洗,代表map函数产生的输出到reduce的消化输入的整个过程。

map任务的输出结果位于运行map任务的Nodemanager所在的节点的本地磁盘上,NodeManager需要为这些输出文件运行Reduce任务,但是,Reduce任务可能需要多个Map任务的输出作为其输入。每个Map任务的完成时间不同,当只要有一个任务完成,Reduce任务就开始复制其输出。这就是shuffle中的copy阶段。
这里写图片描述
复制完所有的map输出,shuffle进入sort阶段,这个阶段将合并map的输出文件,并维持其顺序排序,其实做的就是归并排序。
4. reduce及最后结果的输出
reduce阶段操作的实质就是对经过shuffle处理的文件调用reduce函数处理,由于经过了shuffle的处理,文件都是按键分区且有序,对相同分区的文件调用一次reduce函数处理,其输出一般放到HDFS。
5. mapReduce中的sort

排序贯穿于map和reduce任务,排序操作是mapreduce的默认行为,不管是否需要,都会排序。在其中,主要有两种排序:快速排序和归并排序。

在map和reduce任务中,一共发生了3次排序操作。

  • 当map函数产生输出时,会首先写入内存缓冲区,当达到阈值时,在刷写磁盘之前,后台线程会将缓冲区的数据划分成相应的分区。在每个分区中,后台线程按键进行内排序(快速排序)。
  • 在map任务完成之前,磁盘上存在多个已经分好区,并排好序,大小和缓冲区一样的溢写文件,这时溢写文件将被合并成一个已分区且已排序的输出文件。由于溢写文件已经经过第一次排序,所以合并文件时只需要做一次排序就可以使输出文件整体有序(归并排序)。
  • 在shuffle阶段,需要将多个map任务的输出文件合并,由于经过第二次排序,所以合并文件时只需要在做一次排序就可以使输出文件整体有序(归并排序)。
    这里写图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值