1 流程示意图
2 解析
-
假如我们有一个文件ss.txt大小为200M的待处理文件,放在input目录下
-
客户端在submit job之前,获取待处理数据的信息, 然后根据参数配置, 形成一个任务分配的规划.把待处理的文件进行切片,200M大小的文件切成两个分区.
ss.txt 0 - 128M 第一个分区
ss.txt 128 - 200M 第二个分区
-
客户端把切片信息还有需要的jar包和配置文件提交提交到Yarn 路径(如果是本地的话提交到本地路径)
-
如果是提交到yarn,yarn中的Mr appmaster 会获取信息,根据切片信息计算出MapTask的数量(一般是多少个切片多少个Task),创建MapTask分别处理一个切片.
-
MapTask 中的InputFormat 中的RecorderReader会读取文件(按照配置的InputFormat的规则读,默认是TextInputFormat,按行读),获取k-v键值对.
-
读完的数据,会进入用户定义的Mapper中进行逻辑运算.
-
Mapper 中处理完数据之后会把处理后的数据提交给outputCollector,然后outputCollector会把数据存储在环形缓冲区中.
环形缓冲区中左边存储元数据(数据信息),右边会存储数据(真正的k-v值),在写满环形缓冲区总容量(默认是100M)的80%时,会发生溢写(把环形缓冲区的数据写到磁盘中),然后环形缓冲区会反向存储数据(因为前面的数据已经存到磁盘中了,所以前面的数据已经没用,可以覆盖). -
环形缓冲区会根据分区信息,对数据进行分区处理,各分区的数据进行排序(这个步骤是在环形缓冲区中进行的,没溢写之前,排序的算法是快排).
-
然后就溢写到文件
(每满80% 会溢写到一个文件,所以一个分区有好多的文件,而且每个文件内部已经进行过排序的)
在溢写到文件之前可以选择性采用Combiner 对 先进行合并
(原来没有Combiner,数据在各个文件之间会有相同key值,而Combiner是把所有相同的key值得value相加到一起)(Combiner有使用限制的) -
merge 同一个分区的所有文件到一个文件
(这个步骤是用归并排序对已经排好序的同一个分区的文件进行合并,并且合并后文件的数据也是排好序的).**到这里Mapper阶段的工作完成.**然后Mapper Task等待 Reducer Task来拉取数据. -
请看 9).
-
所有MapTask任务完成后,启动相应数量的ReduceTask(多少分区启动多少ReduceTask),并告知ReduceTask处理数据范围(数据分区)
-
ReduceTask会去拉取数据.(一个ReduceTask只处理一个分区的数据,所以一个ReduceTask只拉取一个分区的数据).把各个Mapper Task生成的文件通过归并排序合成一个有序的文件,而且把相同key值的value值相加.
-
然后会进入用户定义的Reducer一组一组的对数据进行逻辑处理.
-
对数据进行分组处理(这步是可选的)
-
通过OutputFormat输出数据(默认是TextOutputFormat
),整个过程完成.
来源:CSDN
作者:andyonlines
链接:https://blog.csdn.net/andyonlines/article/details/104529634