简述MapReduce整个流程
(1) Map端
1.由程序的InputFormat调用RecordReader的read()方法读取外部的数据,返回k,v键值对.
2.读取的k,v键值对传送给map()方法,作为其入参来执行用户定义的map逻辑.
3.Context.write方法被调用时,map()方法的输出结果会被写入到环形缓冲区内.
4.环形缓冲区其实就是一个数组,默认大小100M,大小可以调节,后端不断接受数据的同时,前端数据不断被溢出.
5.spiller组件会从环形缓冲区内溢出文件,这个过程还会进行分区和排序,如果有combiner也会执行combine.Spiller的不断工作,会不断溢出许多小文件,这些小文件仍然在maptask所在的机器上.
6.小文件执行merge(合并),形成分区且区内有序的大文件(归并排序,会再次调用combiner).
7.Reduce会根据自己的分区,去maptask中拉取属于自己的数据.
(2)Reduce端
1.reduce端通过网络向maptask获取数据.
2.分组,并发送给reduce(k,iterator)方法.
3.调用context.write()方法,会让OutPutFormat方法调用RecordWriter的write()方法将结果写入到数据仓库中.