在MapReduce整个过程可以概括为以下过程:

输入 --> map --> shuffle --> reduce -->输出

输入(input)

Input是输入文件的存储位置,默认是HDFS文件系统,当然也可以修改,也可以是本机上的文件位置。

Hadoop入职需要掌握哪些知识 hadoop工作流程_临时文件

1.JobClient输入输入文件的存储位置

2.JobClient通过InputFormat接口可以设置分割的逻辑,默认是按HDFS文件分割。

3.Hadoop把文件再次分割为key-value对。

4.JobTracker负责分配对应的分割块由对应的maper处理,同时 RecordReader负责读取key-value对值。

一、map task阶段

输入文件会被切分成多个块,每一块都有一个map task

map阶段的输出结果会先写到内存缓冲区,然后由缓冲区写到磁盘上。默认的缓冲区大小是100M,溢出的百分比是0.8,也就是说当缓冲区中达到80M的时候就会往磁盘上写。如果map计算完成后的中间结果没有达到80M,最终也是要写到磁盘上的,因为它最终还是要形成文件。那么,在往磁盘上写的时候会进行分区和排序。一个map的输出可能有多个这个的文件,这些文件最终会合并成一个,这就是这个map的输出文件。

(1)Read 阶段
Map Task 通过用户编写的 RecordReader,从输入 InputSplit 中解析出一个个 key/value。

(2)Map 阶段:该节点主要是将解析出的 key/value 交给用户编写 map()函数处理,并

产生一系列新的 key/value。

(3)Collect 收集阶段:在用户编写 map()函数中,当数据处理完成后,一般会调用

OutputCollector.collect()输出结果。在该函数内部,它会将生成的 key/value 分区(调用

Partitioner),并写入一个环形内存缓冲区中。

(4)Spill 阶段:即“溢写”,当环形缓冲区满后,MapReduce 会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。

溢写阶段详情:

步骤 1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号

partition 进行排序,然后按照 key 进行排序。这样,经过排序后,数据以分区为单位聚集在

一起,且同一分区内所有数据按照 key 有序。

步骤 2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文

件 output/spillN.out(N 表示当前溢写次数)中。如果用户设置了 Combiner,则写入文件之
前,对每个分区中的数据进行一次聚集操作。

步骤 3:将分区数据的元信息写到内存索引数据结构 SpillRecord
中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过 1MB,则将内存索引写到文件
output/spillN.out.index 中。

(5)Combine 阶段:当所有数据处理完成后,MapTask 对所有临时文件进行一次合并,

以确保最终只会生成一个数据文件。当所有数据处理完后,MapTask 会将所有临时文件合并成一个大文件,并保存到文件output/file.out 中,同时生成相应的索引文件 output/file.out.index。在进行文件合并过程中,MapTask 以分区为单位进行合并。对于某个分区,它将采用多轮递归合并的方式。每轮合并 io.sort.factor(默认 100)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。让每个 MapTask 最终只生成一个数据文件,可避免同时打开大量文件和同时读取大量小文件产生的随机读取带来的开销。信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。如果当前内存索引大小超过 1MB,则将内存索引写到文件 output/spillN.out.index 中。

二、Shuffle阶段

Hadoop入职需要掌握哪些知识 hadoop工作流程_临时文件_02


1)maptask 收集我们的 map()方法输出的 kv 对,放到内存缓冲区中

2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件

3)多个溢出文件会被合并成大的溢出文件

4)在溢出过程中,及合并的过程中,都要调用 partitioner 进行分区和针对 key 进行排序

5)reducetask 根据自己的分区号,去各个 maptask 机器上取相应的结果分区数据

6)reducetask 会取到同一个分区的来自不同 maptask 的结果文件,reducetask 会将这些

文件再进行合并(归并排序)

7)合并成大文件后,shuffle 的过程也就结束了,后面进入 reducetask 的逻辑运算过程

(从文件中取出一个一个的键值对 group,调用用户自定义的 reduce()方法)

3)注意

Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率,原则上说,缓冲区越大,磁盘 io 的次数越少,执行速度就越快。

缓冲区的大小可以通过参数调整,参数:io.sort.mb 默认 100M。

三、ReduceTask阶段

Hadoop入职需要掌握哪些知识 hadoop工作流程_HDFS_03


(1)Copy 阶段:ReduceTask 从各个 MapTask 上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。

(2)Merge 阶段:在远程拷贝数据的同时,ReduceTask 启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。

(3)Sort 阶段:按照 MapReduce 语义,用户编写 reduce()函数输入数据是按 key 进行聚集的一组数据。为了将 key 相同的数据聚在一起,Hadoop 采用了基于排序的策略。由于各个 MapTask 已经实现对自己的处理结果进行了局部排序,因此,ReduceTask 只需对所有数据进行一次归并排序即可。

(4)Reduce 阶段:reduce()函数将计算结果写到 HDFS 上。