MapReduce作业是客户端需要执行的一个工作单元:它包括输入数据、MapReduce程序和配置信息。Hadoop将作业分成若干个任务(task)来执行,其中包括两类任务:map任务和reduce任务。这些任务运行在集群的节点上,并通过YARN进行调度。如果一个任务失败,它将在另一个不同的节点上自动重新调度运行。
     MapReduce框架运转在<key,vlaue>键值对上。
    
整体流程

mapreduce主从结构 mapreduce运行机制中的主要组件_hadoop
mapreduce主从结构 mapreduce运行机制中的主要组件_数据_02

Map端

Map数据的输入和输出,默认读取数据的组件是TextInputFormat
mapreduce主从结构 mapreduce运行机制中的主要组件_mapreduce_03

1.输入数据(input)

2.切片(split) ,Hadoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片(input split)。Hadoop为每一个分片构建一个map任务,并由该任务来运行用户自定义的map函数从而处理分片中的每条记录。
一个分片就是一个由单个map操作来处理的块,每个map只处理一个块。
客户端通过调用getSplits()方法计算分片。
(1):为什么要分片?
答:一台计算机处理每个分片的数据所需要的时间少于处理整个输入数据所花的时间。因此,如果并行处理每个分片,且每个分片数据比较小,那么整个处理过程将会获得更好的负载平衡。另一方面,也不能切分太小,分片切得太小,管理分片的总时间和构件map任务的总时间将决定作业的整个执行时间。一般来说,一个合理的分片大小趋向于HDFS的一个块的大小,默认是128MB,也可手动设置。

3.读数据分片后,将它们传送到application master(AM:应用程序的老大,负责程序内资源申请,监督运行情况),AM使用它的存储信息调度map任务,在集群上处理这些分片数据。
split -->AM -->map
读数据后,切片中数据按照一定是规则解析返回<k,v>对,默认是按行读
key是每一行起始的偏移量
value是本行的文本内容TextInputFormat:读取文本数据组件
<1,Hello tom hello allen hello>

4.map把分片传给InputFormat的createRecordReader()方法获取分片的recordreader(map用它记录键值对),传递给map函数。调用mapper类中的map方法处理数据,没解析一个<k,v>,调用一次map方法

5.分区,按照一定规则对输出的键值对进行分区,默认不分区,只有一个reducetask,分区的数量就是reducetask运行的数量。

改变reducetask的时候,maptask输出结果如何分配给各个reducetask处理?
MapReduce默认分区规则是hashpartitioner,分区的结果只和map输出的key有关。(取模然后分文件)

6.map输出写入内存缓冲区,溢出排序,先把处理的结果返回到缓冲区(buffer in memory),达到一定的比例溢出到磁盘。溢出的根据key进行排序,默认按字典序排序(A-Z),此时溢出的只是临时文件
7.合并溢出的进行合并

map和reduce之间传输

mapreduce主从结构 mapreduce运行机制中的主要组件_mapreduce_04
前提:MapReduce是分两个阶段Map和Reduce,之间数据传递可能跨网络和跨机器。若Map产生大量的数据输出,就可能导致网络传输数据量答,io性能低。
combiner在map阶段使用,对map端输出先做一次局部合并,来减少map和reduce节点之间的数据传输量。默认不启动,本质就是reduce。
combiner是在maptask上每个节点运行是局部聚合
reducer是对maptask的输出结果计算,是全局聚合。

Reduce端

reduce端的输入和输出,默认输出数据的组件是OutputFormat
mapreduce主从结构 mapreduce运行机制中的主要组件_big data_05

map阶段只是局部的,此时要进行汇总,用reduce端
1.复制,maptask处理好数据后,会把数据放到磁盘上,静静等待reducetask来取数据。
2.排序把数据进行合并,合成一个整体大数据再进行排序(a-z)
3.调用把排序后的数据不断进行迭代判断,判断前后两个k是否相等,相等则是同一组,然后继续判断,直到不相等。
最后所有相等的键值对组成一个新的键值对,调用reduce方法
4.键相等键值对调用一次reduce方法,最后把输出的键值对写入到HDFS文件中。

最终输出结果
mapreduce主从结构 mapreduce运行机制中的主要组件_数据_06

mapreduce主从结构 mapreduce运行机制中的主要组件_键值对_07

Shuffle

Shuffle是MapReduce的核心,分布在map阶段和reduce阶段,一般把从map端产生输出开始到reduce取得数据作为输入之前的过程叫做shuffle。
不过频繁会涉及在内存和磁盘中往复。
从上述map第6步到reduce的第2步
mapreduce主从结构 mapreduce运行机制中的主要组件_big data_08
mapreduce主从结构 mapreduce运行机制中的主要组件_键值对_09
mapreduce主从结构 mapreduce运行机制中的主要组件_数据_10