1、MapReduce执行流程
RecordReader->读取文件数据,将数据拆分为kv对
map阶段->调用用户定义程序处理kv对,并对数据进行分区(job.setPartitionerClass)后存储到“环形内存缓冲区”,
当缓冲区达到一定阈值时(默认80%),会启动后台线程将部分数据溢出写入(spill)磁盘的临时文件中,
将数据写入文件前会先进行排序(job.setSortComparatorClass)后执行合并(combine)操作(可选)。
当整个map任务完成溢出写入(spill)后,会将所有临时文件执行归并(merge)操作,生成一个大文件
此时的归并会将spill文件中所有的相同partition合并到一起,并对每个partition中的数据按照key进行排序(sort)操作,生成key和对应的value-list,文件归并时,如果溢写文件数量超过参数min.num.spills.for.combine的值(默认为3)时,可以再次进行合并(combine)。
reduce阶段-> reduce task会从不同的job里拉取map task的最终结果,并将相同的partition数据归并(merge)成一个大文件,对文件中的数据按key进行排序。
之后会对数据进行分组(job.setGroupingComparatorClass)。之后调用reduce进行数据处理
ps:如果:reduce数=1,所有分区都在一个reduce中处理,生成一个文件
1<reduce数<分区数,会报错,有的分区找不到处理的reduce
reduce数>分区数,会有本分reduce没有数据处理,生成空文件
一个分组调用一次reduce()方法
参考:https://blog.youkuaiyun.com/asn_forever/article/details/81233547
https://blog.youkuaiyun.com/u014374284/article/details/49205885