Map执行流程Reduce执行流程shuffle是什么
Map执行流程就拿Wordcount来举例吧,明白了Wordcount就明白了流程
1.当一个大的文件要执行MapReduce任务时会根据HDFS的文件块大小进行拆分,一个文件块对应一个MapTask
2. 之后是对切片的数据按照一定的规则解析成KV的形式, 接口叫做InputFormat,,有一个默认实现叫做TextInputFormat使用LineRecordReader将一行内容解析为KV,行偏移量当做K,一行的内容当做V,作为mapper类的map方法的输入
3. 第三阶段就是执行我们的map方法,第二阶段解析的每一个KV都会调用一次这个方法,这个方法会按照我们的业务逻辑生成KV
4. 当我们的map方法输出之后 会先进入环形缓冲区,缓冲区有一个阈值,默认是0.8,当达到阈值时开始执行溢写的操作,溢写之后会生成溢写文件落盘
5. 在落盘之前MapReduce会对KV进行分区,这时有一个默认的分区方法,将key的哈希值与integer的最大值做&运算,并%1来设置分区,1是reduce的任务数量默认就是1,分区的目的时规整reduce的任务数
6. 之后进行排序,排序时针对K的相同的K按照V来排序
7. 之后执行Comber操作也就是map的reduce目的时为了减少进入reduce的数据量,减少磁盘的IO任务量
8. 之后就是写入到磁盘了,在map任务结束之前会多个磁盘文件执行多路归并算法合并成一个大的文件,至此map任务结束
- reduce接收到通知会复制map阶段的结果文件,map的任务可能会有很多,因此reduce会复制多个文件复制的数据也会进入reduce的环形缓冲区,机制如同map一样,达到阈值开始溢写,落盘之前执行分区排序,合并多个文件为一个大文件,最后一次合并直接作为reduce方法的输入之后就是调用我们的reduce业务了,当reduce运行结束会直接将结果写入到HDFS,多个任务会生成多个文件
shuffle称为map任务结束到reduce任务开始的过程,期间有大量的IO以及分区排序合并,hadoop的核心思想是MapReduce,但shuffle又是MapReduce的核心
一、Map端的shuffle
(1)在map端首先接触的是InputSplit,在InputSplit中含有DataNode中的数据,每一个InputSplit都会分配一个Mapper任务,Mapper任务结束后产生
(2)写磁盘前,要进行partition、sort和combine等操作。通过分区,将不同类型的数据分开处理,之后对不同分区的数据进行排序,如果有Combiner,还要对排序后的数据进行combine。等最后记录写完,将全部溢出文件合并为一个分区且排序的文件。
(3)最后将磁盘中的数据送到Reduce中,从图中可以看出Map输出有三个分区,有一个分区数据被送到图示的Reduce任务中,剩下的两个分区被送到其他Reducer任务中。而图示的Reducer任务的其他的三个输入则来自其他节点的Map输出。
二、Reduce端的shuffle
Reduce端的shuffle主要包括三个阶段,copy、sort(merge)和reduce。
(1)Copy阶段:Reducer通过Http方式得到输出文件的分区。
reduce端可能从n个map的结果中获取数据,而这些map的执行速度不尽相同,当其中一个map运行结束时,reduce就会从JobTracker中获取该信息。map运行结束后TaskTracker会得到消息,进而将消息汇报给JobTracker,reduce定时从JobTracker获取该信息,reduce端默认有5个数据复制线程从map端复制数据。
(2)Merge阶段:如果形成多个磁盘文件会进行合并
从map端复制来的数据首先写到reduce端的缓存中,同样缓存占用到达一定阈值后会将数据写到磁盘中,同样会进行partition、combine、排序等过程。如果形成了多个磁盘文件还会进行合并,最后一次合并的结果作为reduce的输入而不是写入到磁盘中。
(3)Reducer的参数:最后将合并后的结果作为输入传入Reduce任务中。
最后就是Reduce过程了,在这个过程中产生了最终的输出结果,并将其写到HDFS上。
这是MapReduce的运行过程图:



