MapRedue详细工作流程
简述
(1)客户端submit之前获取待处理的数据信息,根据参数配置,形成一个任务分配的规划。(2)提交切片信息到YARN(split.xml,job.split,wc.jar)(3)由MRAPPMaster计算出MapTask的个数(4)启动MapTask(5)通过InputFormat拷贝数据,默认使用TextInputFormat(6)执行用户自定义的Map()方法(7)写出数据到环形缓冲区(8)环形缓冲区默认大小是100M,80%溢出文件。溢出文件之前对数据进行分区排序(9)环形缓冲区溢写到文件中,此时的文件是分区且有序的(10)对结果文件进行归并排序(11)如果设置有合并操作,执行合并,合并之后再次进行归并(12)所有的MapTask执行完成之后,启动相应数量的ReduceTask,并告知Reduce的操作范围(分区)(13)Reduce拷贝Map端的输出文件,先拷贝到内存,内存不足,写入到磁盘(14)合并文件,归并排序,进入Reduce方法(15)如果设置了分组操作,进行分组(分组是为了让两个不相同的对象, 通过某一个条件让其认为是一个对象,从而进入到一个Reduce方法中) (16)执行用户自定义的Reduce方法(17)通过OutputFormat将执行的结果输出到文件中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。
本博客仅为博主学习总结,感谢各大网络平台的资料。蟹蟹!!