mapreduce框架的工作机制(原理深度解析)-----------------------可以结合下面的一篇文章查看根据原理去优化MapReduce代码

有疑问的可以留言一块讨论:
1.先看一下yarn的整体运行机制再详细说MapTask和ReduceTask的具体流程(一张高清大图)
Driver相当于公司的老板, RecourseManager相当于一个总管,MRAppMaster相当于工作人员听从老板的吩咐,它会提出各种需求请求RecourseManager去执行,当然RecourseManager会指派手下的nodeManager去执行任务
方便记忆,自己联想了一幅场景(老板请求一个job,总管返回任务的id、切片等信息,老板讲信息放到自己的存储容器中(HDFS),之后指派工作人员(MRAppMaster)去实时监测并且完成任务,AppMaster首先从HDFS上加载任务信息,查看要求之后,申请运行yarnChild,之后领取HDFS中的详细资源后发送启动命令,开始执行MapTask和ReduceTask,直到结束)。
这里写图片描述

2.重点是启动之后MapTask如何工作
(1)先进行切片,将每个文件划分成最大是128M的片(每个切片里面有文件的信息),如果文件不够128M,每个文件都独立切片(根据切片的数量决定MapTask的数量) 形成一系列对象,再把对象放到ArrayList中,序列化到一个文件 (job.split)

这里写图片描述

(2) 读取数据,并且产生key、value
MrAppMaster进行任务的分配,分配好之后就开始工作,TextInputFormat开始读数据,一次读一行(通过LineRecordReader方法中的next方法),next方法反复调用并且将产生的key(行起始偏移量),value(行内容)调用自己的写的逻辑去处理数据,比如词频分析的逻辑,里面的**contex.write**t就会存储key、value,最后交由MapOutPutCollector缓冲起来(二进制)

这里写图片描述

(3)直到缓冲区(环形缓冲区)快满的时候(80%),Spiller进程就会对数据进行分区(Patitioner的getPartiaiondr())和排序(key的comparTo),分区的优化就是这个时候进行,排序的优化只要自己重写了方法就会一直贯穿整个过程的排序,完成之后将内存中的数据写到本地磁盘(多个溢出文件),都是已经排好序的(通过快速排序,使得同区中的key有序,区号小的在前面),直到数据都读完之后,就将小文件合并(Merge合并),合并成分区且有序(归并排序)的文件(里面同时又索引文件,记录分区号),纳入到NodeManager的web程序document目录中(可以供ReduceTask下载这个文件),此时MapTask的任务完成

这里写图片描述


Map传递给Reduce的过程叫SHUFFLE

(4)MrAppMaster启动ReduceTask程序
ReduceTask根据NodeManager的web程序document目录去寻找属于自己的数据(同一个key),并将多个文件相同key的数据合并到一块(归并排序)并且进行分组

这里写图片描述

(5)开始调用自己的ReduceTask类
根据(reducer(key,迭代器,context))方法迭代,(k,v;k,v;k,v),这样就一直是同一个key,所有key的value。在这个过程中有一个分组器监视是不是同一个key,如果不是同一个key就迭代下一组key的value,所有都迭代完之后,进行context.write(k,v)传递给工具类TextOutputFormat的方法getRecordWriter()后形成新的对象(recirdWriter)并且传给write方法将数据写出到HDFS上或者本地文件
这里写图片描述

这个是整个图:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_41166135/article/details/82025007