MapReduce实际上就是一种分而治之的思想,简单来说就是由map进行分解和reduce进行合并数据的过程。
具体的说,map端先对输入的数据进行切片(input split),每个切片都由一个map进行处理,map处理后的结果存储到环形内存缓冲区。由于该环形内存缓冲区存储为100M,当超过其阈值80%时,会将该缓冲区中的数据写入本地所创建的溢写文件,之后对缓冲区中的数据进行分区(hash分区)、排序(快速排序)以及合并到磁盘中。
reduce通过获取jobtracker中维护的整个集群的宏观信息,从map中fetch磁盘中对应的输出位置即可。由于reduce本身也具有环形内存缓冲区,其阈值也是80M,将该缓冲区的数据写入溢写文件中,后台线程不断将小数据文件合并为有序的大文件(归并排序),合并后的数据交给reduce作为输入,并执行内部的业务逻辑代码进行处理,最终输出到hdfs/本地。
ps:
合并的目的:1、尽量减少写入磁盘的数据量;2、减少数据传输到下一个阶段的数据量。
hash分区:决定将哪些数据分配给哪个reduce。
shuffle阶段:从map任务的输出到reduce任务的输入。最致命的问题是网络带宽。
本质:1、尽可能减少网络带宽带来的不必要的消耗;
2、(排序和合并)优化内存使用,减少磁盘的IO操作。