MapReduce处理过程分析

来源:互联网 发布:软件售前工程师简历 编辑:程序博客网 时间:2024/05/29 17:20

注意:
1.在mr中,所有的key是需要被比较和排序的,并且是二次,先根据partitioner分区,再根据大小。所以我们可以利用分区对第一个字段排序,在利用分区内的Key比较,进行第二个字段的排序,这可以实现一个二次排序。
2.源代码中的sortAndSpill()方法内部流程:
第一步,使用用快速排序算法对kvbuffer[bufstart,bufend)中的数据排序,先对partition分区号排序,然后再按照key排序,经过这两轮排序后,数据就会以分区为单位聚集在一起,且同一分区内的数据按key有序;
第二步,按分区大小由小到大依次将每个分区中的数据写入任务的工作目录下的临时文件中,如果用户设置了Combiner,则写入文件之前,会对每个分区中的数据做一次聚集操作,比如

Map阶段:    1. 使用job.setInputFormatClass(TextInputFormat)做为输入格式。注意输出应该符合自定义Map中定义的输出。    2.调用job.setPartitionerClass(),对指定的key落在具体的分区    3.每个分区内又调用job.setSortComparatorClass()设置的key比较函数类排序(如果没有通过job.setSortComparatorClass()设置key比较函数类,则使用key的实现的compareTo方法)。可以看到,这是一个二次排序。    4.如果设置了Combiner(job.setCombinerClass)对output进行一次合并,从而减少对reduce的输出流量和预处理reduce的input数据。Reduce阶段:    1.shuffle阶段    reducer开始fetch所有映射到这个reducer的map输出。    2.sort阶段    再次调用job.setSortComparatorClass()设置的key比较函数类对所有数据对排序(因为一个reducer接受多个mappers,需要重新排序)。合并排序:接受来自不同map的相同key值和排序是同时进行的,形成一个序列,跟oracle类似,所以reduce方法的迭代器调用之前就已经排好序了    3.    使用jobjob.setGroupingComparatorClass()设置的分组函数类。然后开始构造一个key对应的value迭代器,这个迭代器的key使用属于同一个组的所有key的第一个key4.    调用Reduce方法进行处理
[http://flyingdutchman.iteye.com/blog/1878775]
0 0
原创粉丝点击