mapReduce工作流程
image.png image.png
提交:
1.准备文本 ,假如文件有 200M
2.对文本进行切片
InputFormat(抽象类)负责切片
InputFormat 其中有 两个方法(getSplits、createRecordReader)
InputFormat是个抽象类,FileInputFormat继承了InputFormat,重写了getSplits方法
成果:将文本切成两片 0-128M 128-200M
3.(1)将 切片信息【job.split】、jar包【wc.jar】、配置信息【job.xml】上传到HDFS上
(2)【客户端】将该Job信息提交到yarn的ResourceManager
-
ResourceManager启动AppMaster【任务的老大】
AppMaster会将hdfs上的 切片信息、jar包、配置信息等拷贝过来
根据拷贝过来的信息,向ResourceManager申请资源(两个切片,申请两个资源)
此时,ResourceManager会在集群上启动两个Container。AppMaster就会在这两个Container上启动MapTask。 -
MapTask需要通过InputFormat中的createRecordReader方法读数据,返回一个RecordReader(抽象类)对象【例如:LineRecordReader,特点一行一行读】
实际上默认是TextInputFormat。因为TextInputFormat重写了createRecordReader方法,并返回了LineRecordReader。
结果:将数据一行一行的读到Mapper的map方法中
-------------map方法往外写后-----
map --> sort --> copy --> sort --> reduce
1.map方法往外写后会到环形缓冲区。
数据 与 索引
写到80%以后,开始反向写
环形缓冲区底层是个数组【byte[]】
环形缓冲区的作用是:排序,默认按照key的字典序,排序算法:快排
写进缓冲区的数据主要分三个部分:key,value,分区号
环形缓冲区大小100M,在内存中,因为底层为数组,数组在内存中
问:为什么写80%就反向写
如果写满,才开始排序,map就不能再往里面写数据
2.分区号:
如果要将a-p p-z 分开放到两个文件
在环形缓冲区排序之前,先分区
最后按照分区排
3.排完序,会将数据写入到磁盘中
写入磁盘时,也是按照分区写
4.当文件大于100M的80%时,就会出现第二次溢写。
5.后面溢写出来的文件会跟之前的文件进行 归并排序,按照分区,合并成一个文件。
6.两个map方法输出的数据 会被拷贝到 reduce的内存缓冲中。
7.进行归并排序,形成分组。
8.给reduce方法传数据
网友评论