MapReduce之Reduce

我们接着MapReduce之Shuffle

Copy

在这里插入图片描述

走到这里,我们就进入到reduce了。

在这里插入图片描述

reduce有三个明确的阶段:copy,sort,reduce。

在初始化ShuffleConsumerPlugin的时候,他需要创建一个MergeManager:

在这里插入图片描述

在这里插入图片描述

这个MergeManager就是用来做文件合并的。

在这里插入图片描述

接下来我们使用localFetcher去拉取map的输出文件。

在这里插入图片描述

在此我们将获取file.out文件和file.out.index文件。

在这里插入图片描述

我们将所有的data读取到memory这个byte数组中。

在这里插入图片描述

此时copy就结束了。

Merge

在这里插入图片描述

我们进入merger.close()并注意它的返回值是RawKeyValueIterator,这里将封装所有数据。

在这里插入图片描述

finalMerge中,它经历了几次merge,我们看看最终的效果:

在这里插入图片描述

首先磁盘上有溢写的merge file。

在这里插入图片描述

最终返回的MergeQueue是一个RawKeyValueIterator,它里面有一个Object数组存放着所有数据。

在这里插入图片描述
最后我们会将RawKeyValueIterator传递下去跑reducer。

Reduce

在这里插入图片描述

首先我们要构建一个Reducer的上下文对象,将他作为参数扔到reducer.run中。

这时候就会来到我们熟悉的自定义的reduce方法。

在这里插入图片描述

我们将跟踪context.nextKey()方法,看他经历了哪些过程:

在这里插入图片描述

在这里插入图片描述

注意此时的keyvalue都是空的,而那个input就是我们一直关注的RawKeyValueIterator

在这里插入图片描述

这里的buffer已经有了hadoop这个词的位置和数据了。

跟踪key = keyDeserializer.deserialize(key);

在这里插入图片描述

最后我们读到了hadoop并返回,注意到writable.readFields(dataIn)dataIn就是之前的buffer对象。

在这里插入图片描述

这样我们就进到了自己的reduce方法。因为之前排过序(归并排序)了,所以同一个key的数据会一次性进入reduce方法。

写完后我们就会得到一个分区的结果:

在这里插入图片描述

然后再来一个ReduceTask处理第二个分区:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值