Hadoop WordCount组合器

时间:2016-10-14 06:39:29

标签: java hadoop word-count

https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Source_Code

在单词计数示例中,reduce函数用作组合器和reducer。

var temp = JsonConvert.SerializeObject(interestingParts.Select(x => new[] { x }));
var answer = temp.Substring(1, temp.Length - 2).Replace(",", ", ");

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

   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));
   }
  }

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

  <Java,1> <Virtual,1> <Machine,1> <Java,1>

因为我们一次考虑一对kv? 我知道这是一个错误的假设;请有人请你纠正我

3 个答案:

答案 0 :(得分:1)

如果我们查看{{3},那么 IntSumReducer类 会继承 Reducer类以及在这里做魔术的Reducer类}

  

&#34;将一组共享一个键的中间值减少为一组较小的值。   Reducer实现可以通过JobContext.getConfiguration()方法访问作业的配置。

     

Reducer有3个主要阶段:

     

随机播放:Reducer通过网络使用HTTP复制每个Mapper的排序输出。

     

排序:框架合并按键对Reducer输入进行排序(因为不同的Mappers可能输出相同的键)。

     

随机和排序阶段同时发生,即在提取输出时,它们被合并。&#34;

程序调用同一类进行合并和减少操作;

job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);

所以我想到的是,如果我们只使用 一个数据节点 ,我们就不必为这个 wordcount程序调用组合器类因为reducer类本身负责组合器的工作。

job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);

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

答案 1 :(得分:0)

Combiner在发送到reducer之前先合并mapper结果。

主机上的映射器可以输出许多相同的kv对密钥。而且合并器将

在发送到reducer之前先合并地图输出,从而减少

mapper和reducer之间的shuffle成本。

因此,如果一个带有输出的映射器(key,1)(key,1),组合器将组合起来 结果为(key,[1,1])

答案 2 :(得分:0)

Combiner在Map Output上运行。 在你的情况下,Map Output就像,

<Java,1> <Virtual,1> <Machine,1> <Java,1>,

因此它将针对每个键运行,因此在您的情况下,Java存在两次,因此它生成结果为(Key,[逗号分隔值])。