@mapReduce详细工作流程
mapReduce详细工作流程
面试的时候对mapreduce过程不是很熟悉,写个文档记录分享一下
工作流程
- 读取指定目录下待处理文件,假设数据大小为200M;
- 在客户端submit()之前,获取待处理数据的信息,然后根据设置的配置参数,形成一个任务规划,就是切片信息,根据待处理数据文件大小根据参数配置划分为不同的文件,默认是128M进行切分,待处理数据文件就会被切分成两个文件;
- 切片完成之后,就会向Yarn提交切片信息(Job.split .jar job.xml);
- Yarn收到消息之后会调用ResourceManager创建一个ApplicationMaster(AppMaster)它是负责资源调度的,AppMaster根据提交的信息计算出MapTask的数量,根据例子为两个mapTasks,并启动mapTask;
- 启动完mapTask之后,InputFormat里的RecoderReader去读取待处理数据,把数据返回给Mapper,map函数就会根据用户自定义的逻辑进行处理得到新的<k,v>;
- 得到新的<k,v>对之后,会有collector进行收据数据;
- 收集完成之后就会向一个环形缓冲区中写入数据(环形缓冲区默认大小100M内存)当写道80%的时候就会反向溢写到磁盘中;
- 在环形缓冲区中会对数据进行分区 partition,然后再分区内部进行排序(因为不同分区会对应不同的reduceTask所以再内部分区就可以)通过使用快排算法按照字典顺序对key排序。
- 完成之后把文件序列化溢写到磁盘形成一个个小文件。
- 然后进行merge归并排序,意思时按照分区,对属于同一个分区内的小文件合并之后再进行排序。
- 当所有的mapTask完成之后,Appmaster启动相应分区数量的reduceTask处理数据
- reduceTask复制mapTask已经归并排序好的数据,将相同分区的数据放在同一个reduceTask的本地磁盘中。
- 将不同mapTask中的partition数据复制到同一个reduceTask之后需要在将多个小文件进行合并排序为一个大文件
- 然后按照相同key作为一组数据做reduce处理,处理完成之后,然后将最后结果写到指定位置。
在map阶段数据处理完后之后会对数据进行一个分区操作,根据源码分区的算法是:
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks