MapReduce分为两个阶段,分为Map阶段和Reduce阶段,可以自定义map函数和reduce函数,
map函数的输入是行在文件的字节偏移量,value是文件的一行数据。
reduce函数的输入是key和对应key的value组,然后reduce函数可以对这一组数据进行处理
再来看mapreduce是如何实现的,因为可以知道reduce阶段的value是一组的,包括mapreduce还发生了文件读取和写入文件的操作,包括一些序列化
当有一个文件时,文件在底层操作系统是很多个数据块,
map是以数据切片逻辑进行处理的,所以当读取文件数据时,会对物理文件进行逻辑切片,然后一个切片就对应一个MapTask,尽量保证切片大小等于数据块大小,让一个MapTask直接本地处理,加快处理速度
Map阶段处理逻辑,map读入文件的每行数据,然后以key-value的方式处理输出到一个分区,输出到哪个分区取决于默认的还是自定义分区处理了,默认是根据键的哈希值确定分区。
分区其实是先保存到一个环形缓存区,当环形缓存区达到一定阈值的时候,就会把缓冲区数据落盘,落盘前会对分区内的数据进行快速排序,如果有多个小文件,会对多个小文件进行归并排序,合成一个大文件,然后分区和reduceTask的数量一样。
reduce阶段,reduce可会读取所有mapTask对应分区的所有文件,如果有多个文件,也会进行归并排序,这样就保证了Reduce函数的输入里的value,是一个相同Key的value集合。然后经过reduceTask函数进行数据处理,最终输出,输出文件数也跟reduceTask的个数相关,reduceTask的数目不能大于分区数目