整体流程
MapReduce是由一组数据每条记录通过Map方法映射成为一组KV数据,相同key为一组执行reduce方法,方法内迭代执行数据。
由图所示,数据输入来源于HDFS的块,由HDFS块读取同样大小的切片数据,切片数据通过格式化format成一条条record记录,record作为map方法入参执行map方法生成kv键值对数据(1条、多条、或者无输出)。
在所有的record执行完map后,将所有的kv键值对,根据不同的key分组copy到不同的reduce机器上,将不同的map机器数据合并完后,同一key的数据执行reduce方法,输出最终数据。
并行度
Map的并行度由split的数量决定(默认是1:1关系),Reduce的并行度由人为决定(默认1)
映射关系
block:split 可能为1:1、1:n、n:1
split:map为1:1
map:reduce可能为1:1、1:n、n:1、n:n,但是同一组数据不同打散到不同reduce,不然数据不准
group(key):partition可能为1:1、1:n、n:1、n:n同一组数据只能写入一个分区
任务流程
MapReduce任务流程
一次Map Reduce的流程如上图所示。在map阶段,输入切片通过指定的格式化方法生成记录,记录通过map方法映射生成kv键值对,通过kv键值对计算分区p,将kvp值写入内存缓冲区。在缓冲区溢出写磁盘时同时做两次排序,一次根据分区P进行排序,一次根据k进行排序,将排序后的数据写入磁盘。
在reduce阶段,对来自不同map机器的数据进行归并排序,归并到最后两个文件时,reduce和归并排序可以同时进行。
对节省IO做的优化:
1、数据先写入缓冲区
2、在缓冲区做两次排序后在写入磁盘,缓冲区速度是磁盘的N倍。保证分区P的排序后可以实现多台reduce机器fetch文件时只需要打开文件直接读取属于自己分区P的数据,无须从头到尾扫描。同理保证K的顺序,可以在reduce时,对一组数据(相同key)调用方法,可以打开文件顺序读取key相同的数据