MapReduce处理过程分析

注意:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值