Map阶段
1.客户端在submit提交作业之前获取待处理信息,根据参数配置信息形成一个任务分配规划信息(如数据切片信息,各种参数配置元数据等)
2.客户端提交作业信息,内容包括:split切片信息,jar包,xml参数配置信息
3.YarnRM,计算出MapTask的数量,有MrAppMaster同一管理分配到各NodeManager上
4.MapTask任务中,由InputFormat(有多种,默认为TextInputFormat文件读取)来管理,RecorderReader来读取数据。读取的数据类型为kv键值对,k为偏移量,v为一行数据。
5.由程序员编写的处理逻辑,将读取进来的kv处理为新的kv键值对
6.新的kv数据,由OutputCollector将数据写入环形缓冲区(一个存储mapper处理后的数据缓冲区,默认为100M)
7.缓冲区的数据量达到80%时,将会对缓冲区中的数据进行分区排序,然后写入磁盘中。同时将反向向缓冲区里继续写入mapper处理后的数据。(达到80%后将会继续分区排序并落盘,然后反向写入。这里会根据数据量的大小,可能产生多个溢写文件)
8.所有的数据处理完成后,将会对所有的溢写文件进行合并和归并排序,最终形成一个文件
注意点:
所有涉及到文件读取与写入的地方都可以使用压缩,目的是为了减少网络io磁盘io,但会增加CPU负荷。
分区默认是根据key的hashcode值对reduceTask数量进行计算得到的。也可以自定义分区规则
reduce阶段
1.MrAppMaster检测到MapTask完成后,将会根据分区来开启相应数量的ReduceTask
2.ReduceTask主动去所有MapTask输出的文件中寻找对应分区的数据
3.ReduceTask将所有数据进行一次归并排序,并生成一个文件
4.ReduceTask读取数据,并按照编写的处理逻辑运行
5.通过outputFormat管理,RecordWriter输出数据(可以是文件也可以是数据库等)