首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hadoop WordCount组合器

Hadoop WordCount组合器
EN

Stack Overflow用户
提问于 2016-10-14 06:39:28
回答 3查看 1.6K关注 0票数 2

代码

在单词计数示例中,约简函数被用作组合器和减速器。

代码语言:javascript
复制
   public static class IntSumReducer extends Reducer<Text, IntWritable, Text,IntWritable> {

      public void reduce(Text key, Iterable<IntWritable> values, Context context) 
    throws IOException, InterruptedException {
       int sum = 0;
       for (IntWritable val : values) {
           sum += val.get();
       }
       context.write(key, new IntWritable(sum));
   }
  }

我理解还原器的工作方式,但在组合器的情况下,假设我的输入是

代码语言:javascript
复制
  <Java,1> <Virtual,1> <Machine,1> <Java,1>

它考虑了第一对kv,并给出了相同的输出.!!?因为我只有一个价值。为什么它同时考虑了两个键

代码语言:javascript
复制
  <Java,1,1>  

既然我们一次只考虑一个kv对?我知道这是一个错误的假设,请有人纠正我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-23 05:43:17

IntSumReducer类继承了Reducer类和Reducer类,在这里可以看到文档

“将共享密钥的一组中间值缩减为一组较小的值,还原器实现可以通过JobContext.getConfiguration()方法访问作业的配置。 减速器有三个主要阶段: 清除: Reducer通过网络使用HTTP复制来自每个Mapper的排序输出。 排序:框架合并按键对减速器输入进行排序(因为不同的映射程序可能输出相同的键)。 洗牌和排序阶段同时进行,即在获取输出时,它们被合并。“

调用同一个类的程序,用于合并和减少操作;

代码语言:javascript
复制
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);

所以我想出的是,如果我们只使用一个数据节点,我们不一定要为这个字计数程序调用组合器类,因为还原器类本身负责组合器的工作。

代码语言:javascript
复制
job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);

如果只使用一个数据节点,上述方法对字计数程序也有相同的影响。

票数 1
EN

Stack Overflow用户

发布于 2016-10-14 07:12:32

在发送给减速器之前,组合器首先组合映射结果。

主机上的映射器可以输出许多相同的kv对键。和组合意志

在发送到减速机之前,先合并map输出,从而减少

映射器和减速器之间的洗牌成本。

因此,如果映射器具有输出(key,1) (key,1),组合器将将结果组合为(key ,1,1)。

票数 0
EN

Stack Overflow用户

发布于 2016-10-14 07:14:36

组合器在Map输出上运行。在您的case Map输出中,

代码语言:javascript
复制
<Java,1> <Virtual,1> <Machine,1> <Java,1>,

因此,它将为每个键运行,因此在您的示例中,Java出现了两次,因此它生成的结果为(Key,逗号分隔的值)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40036518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档