一、首先是map层
1、首先我们的文件是存储在hdfs,hdfs存储文件是按block块进行存储的,每个块的大小默认是128M。
2、我们是用InputFormat下边的子类TextInputFormat进行文件按行读取成K1 V1 模式
K1:这一行的起始点在文件中的偏移量
V1:读取到的内容
3、每个block都会启动一个MapTask进行处理,map的主要操作就是将读取的内容转换成 K2 V2
二、进入Shuffle阶段,生成新的K2 V2
1、 对map阶段输出的k2和v2对进行分区
可以根据K2的长度、大小、尾号等等进行分区
2、 对不同分区的数据按照相同的Key排序
可以根据自定义的规则对数据进行排序
3、(可选)对数据进行局部聚合, 降低数据的网络拷贝
规约就是对相同K的数据的值存到一个集合中(或者相加)或者自定义处理,可以用来减少网络IO传输
4、对数据进行分组, 相同Key的Value放入一个集合中,得到K2和[V2]
根据K进行分组
三、Reduce阶段
1、对map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
2、对多个map任务的输出进行合并、排序。编写reduce方法,在此方法中将K2和[V2]进行处理,转换成新的key、value(K3和V3)输出,并把reduce的输出保存到文件中
这里有几个ReduceTask是根据我们的分区数量来的