hadoop之从数据流向角度分析MapReduce流程

从数据流向角度分析MapReduce流程

JobTracker:负责任务的调度和集群资源监控

TaskTracker:负责汇报心跳和任务的执行

1、input

MapReduce计算框架首先会用InputFormat类的子类FileInputFormat类将作为输入的HDFS上的文件切分形成输入分片(InputSplit),每个InputSplit将作为一个Map任务的输入,再将InputSplit解析成键值对。InputSplit将解析好的键值对作为map函数的输入。默认是将行号和本行的内容作为键值对最为输入的,InputSplit的大小可以大于一个数据块的大小也可以小于数据块的大小。

2、map及中间结果的输出

每个map任务都有一个环形内存缓冲区,用于存储map函数的输出。当缓冲区的内容达到阈值,一个后台进程便会将缓冲区的内容溢写(spill)到磁盘中。

(1)、在写入磁盘前,数据会根据最终要传送到的Reducer把缓冲区进行分区(partition),默认是按照键值。在每个分区中,后台线程按照键来进行内排序(第一次排序为快速排序)。

(2)、在写入磁盘前,可以进行Combiner,作用是合并相同key值的value。目标是把map输出的中间结果更紧凑,使得写到本地磁盘和传送给Reducer的数据更少,提高效率,combine适合求最大值、最小值和求和等操作。

(3)、第二次排序时合并多个溢写的文件,做的是归并排序,最后合并的结果是一个已经分区且已经排序的输出文件。

3.shuffle也叫数据混洗

(1)、一个操作是拉取拷贝(Copy)map的中间结果到执行Reducer任务的taskTracker所在的节点上。拉取拷贝过程会把多个spill结果的相同分区拷贝到一个reducer

所以当reducer个数等于partition个数时,每个reducer结果只包含某一个分区的数据。

当reducer个数少于partition个数时,会同时出现一个分区数据在一个reducer上面和两个分区数据在一个reducer上面。

当reducer个数多于partition个数时,多个task的结果是空值。

在这里插入图片描述

在这里插入图片描述

(2)、第三次排序,把多个map的中间结果进行合并。用到的是归并排序。

当所有map输出都拷贝完毕之后,所有数据被最后合并成一个排序的文件,作为reduce任务的输入。经过shuffle处理的文件都是按键分区且有序的。但是是对每一个reducer来说的,不同的reducer之间没有顺序关系(详见二次排序的例子)。

4、对相同分区的文件调用一次reduce函数处理。

5、示例:单词统计计数

(1)、Map任务的输入每个InputSplit将作为一个。map函数的输入InputSplit将解析好的键值对

(2)、map任务的输出是,首先会有多个map任务,每个map任务的输出是一个已分区和已排序的文件

(3)、shuffle会自动进行多个Map任务的合并和排序,shuffle的结果是多个map任务合并后的按键分区和排序的文件

(4)、shuffle后也会有多个文件,对应多个reduce任务,每个分区的所有value值作为reduce函数的输入

 

6、总结点:

(1)、map操作的中间结果存储在磁盘上,reduce操作的输出结果在HDFS上。

(2)、map任务处理的是一个InputSplit,reduce任务处理的是所有map任务同一个分区的中间结果。

(3)、归并排序实际是对相同分区内的数据进行排序。

(4)、mapper类的执行是将文件的行号和该行的内容作为输入,每一行调用一次map方法。Reducer类的执行是相同的分区作为输入,相同的分区调用一次reduce方法(详见join表的例子)。

(5)、mapTask(mapper)个数取决于输入分片的个数(InputSplit)。reduceTask(reducer)任务个数默认为1,每次需要进行代码设置job.setNumReduceTasks(50)

7、控制shuffle

(1)、自己写Partitioner

Partitioner同样也有泛型,因为patitioner操作是在map函数处理完数据后未写入磁盘前进行的,他的泛型表示的是map函数输出的结果类型。getPartiion方法处理的是map函数未经处理直接输出的结果,接受的key和value代表了map函数的输出结果。hadoop默认使用的是按照key是否相同进行分区

(2)、控制sort的规则。排序在MapReduce框架下一定会执行的,但规则我们可以控制。

hadoop默认的排序是将键值对的键传给比较compare方法进行比较

发布了159 篇原创文章 · 获赞 75 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/xuehuagongzi000/article/details/76736979