MapTask运行的整个过程:
1、默认通过TextInputFormat读取数据,数据都是存放在hdfs的某些block块上
2、调用Map逻辑:默认一个block块对应一个切片,这个可以查看源码(TextInputFormat继承的父类里面就有原理),发现block块多大这个切片就多大。(1,2步骤就是从磁盘到内存的过程)
3、数据写入环形缓冲区(开辟的一块内存),默认环形缓冲区大小是100M,这个cloudera官网可以看配置,将从磁盘读取的数据进行分区,排序,规约,分组操作。
4、当环形缓冲区写到80M的时候,也就是80%,这个在cloudera官网可以看到配置,达到环形缓冲区80%的时候就会发生溢写操作spill,此时开启一个线程将环形缓冲区80M的数据写入到磁盘一个小文件中。
5、一个切片将对应的一个block块中所有数据都经过环形缓冲区写入磁盘一个一个小文件完成之后,就需要对这些小文件做一个合并merge,将合并后的大文件放入磁盘临时区域。
6、等待reduce阶段的调用
ReduceTask运行的整个过程:
1、拉取ReduceTask默认情况下,只会启动一个ReduceTask,也就是只有一个输出文件。也可以在main主入口下指定reduce个数,这时候指定几个就有几个输出文件。每个reduce都会从map阶段得到的每一个相对大的文件拉取属于自己的那一部分数据。
2、reduce会将拉去到的一个个数据进行合并,因为数据有可能很大,所以合并有可能发生在磁盘,如果小的话就发生在内存,合并的时候同时进行分组
3、调用reduce逻辑
4、输出结果
通过上面可以看出,数据首先从磁盘到内存,在从内存到磁盘(Map阶段)————从磁盘到内存(reduce阶段) ,分区,排序等shuffer步骤都是在环形缓冲区进行,所以调高环形缓冲区就可以让数据更多在内存运行。