MapTask
执行流程
:
(Map
端
shuffle
:
分区 排序 规约
)
1- MapTask
开始读取数据
,
在读取数据的时候
,
会根据文件大小的对文件数据逻辑切片
,
默认按照
128M
进行切片
,
有多少个片,
最终就会有多少个
MapTask
来执行
,
形成
k1
和
v1 , k1
表示行的起始偏移量
v1
表示的每一行的数据
2-
开始执行
Map
逻辑
(
自定义
)
处理
,
接收
k1
和
v1
将其转换为
k2
和
v2
3-
将转换后的
k2
和
v2
写入的环形缓冲区
(
默认
:
100M),
随着不断的写入
,
环形缓冲区的数据会越来越多
4-
当缓冲区中数据达到
80%
的时候
,
就会触发溢写的机制
,
将数据溢写到磁盘上
,
形成一个小文件
,
在溢写的过程中
,
会对数据进行分区操作(
给每一条数据打上分区的标记
),
同时对数据排序操作
,
如果设置了规约
(combiner)
也会在此时来运行的
5-
当
MapTask
执行完成后
,
将缓冲池区最后一部分数据全部溢写出来
,
开始对数据进行合并操作
,
形成一个最终的结果文件即可,
在合并的过程中
,
依然会存在排序和规约的操作
,
形成的结果文件就是分区好 排好序 规好约的结果数据
reduceTask
执行流程
:
(reduce
端
shuffle
:
分组
)
1-
各个
reduceTask
去
MapTask
中拉取属于自己分区的数据
,
在拉取的过程中
,
也是先将其拉取到内存中
,
如果内存不足将其溢写到磁盘上,
最后对数据进行排序合并操作
(
排序的目的就是为了能够更好进行分组操作
)
2-
对数据进行分组操作
,
将相同
key
的数据放置在一起
,
分好一组数据
,
就会触发执行一次
reduce
的逻辑
,
将
k2
和
v2
转换为k3
和
v3
3-
结果进行输出
,
直到将所有的分组全部处理完成
,
整个
reduce
的操作也就全部的结束