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的操作也就全部的结束