Hadoop map task中Partitioner执行时机

 

MapTask.runNewMapper() ->

  ...

  if (job.getNumReduceTasks() == 0) {

      // 无reduce,直接写HDFS

      // 这个writer输出时不执行Partitioner.getPartition()方法

     output =  new NewDirectOutputCollector(taskContext, job, umbilical, reporter);

  } else {

       // 执行Reduce函数,写入本地文件

      // 初始化Partitioner
      output = new NewOutputCollector(taskContext, job, umbilical, reporter); 
  }

  // 将output传入mapperContext

  mapperContext = contextConstructor.newInstance(mapper, job, getTaskID(),
                                                     input, output, committer,
                                                     reporter, split);

 

  mapper.run(mapperContext); <--

 

mapper.run(mapperContext) ->

  while (context.nextKeyValue()) {

      map(context.getCurrentKey(), context.getCurrentValue(), context); <-
    }

 

//map()函数由用户实现,并调用context.write()方法输出
map() ->

  context.write((KEYOUT) key, (VALUEOUT) value); <-

 

write()

  // 实际调用NewOutputCollector.wirte()

  // 先计算key-value的partition,然后执行collect输出数据到内存缓冲区

  collector.collect(key, value, partitioner.getPartition(key, value, partitions));

 

结论:

  1. Partitioner是在map函数执行context.write()时被调用。
  2. 如果没有Reduce函数,则MapTask不会执行Partitioner.getPartition()方法。

 

 --end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值