《hadoop权威指南》读书摘要

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.csdn.net/asn_forever/article/details/81233547

           https://blog.csdn.net/u014374284/article/details/49205885

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章