hadoop字数组合器

b1zrtrql  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(351)

https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/mapreducetutorial.html#source_code
在字数计算的例子中,reduce函数同时用作合并器和归约器。

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

我理解减速机的工作方式,但是在combiner的情况下,假设我的输入是

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

它考虑到第一对千伏电压,并给出相同的输出。。。!!??因为我只有一个价值观。为什么它同时考虑了钥匙和钥匙

<Java,1,1>

既然我们考虑一次一对千伏?我知道这是一个错误的假设;有人请纠正我这一点

pu82cl6c

pu82cl6c1#

合并器首先合并Map器结果,然后再发送到缩减器。
主机上的Map器可以输出多个相同密钥对。合路器会
在发送到reducer之前首先合并map输出,因此
Map器和还原器之间的洗牌开销。
因此,如果一个Map器输出(key,1)(key,1),combiner将把结果合并到(key,[1,1])

brgchamk

brgchamk2#

intsumreducer类继承了reducer类和reducer类,如果我们查看文档的话,它们在这里发挥了神奇的作用
“将共享一个键的一组中间值缩减为一组较小的值。reducer实现可以通过jobcontext.getconfiguration()方法访问作业的配置。
减速器有3个初级阶段:
shuffle:the reducer 通过网络使用http从每个Map器复制排序后的输出。
sort:the framework merge按键对输入进行排序(因为不同的Map器可能输出相同的键)。
洗牌和排序阶段同时发生,即在提取输出时,它们被合并。”
调用同一类进行合并和归约运算的程序;

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

所以我发现,如果我们只使用一个数据节点,我们不必为这个wordcount程序调用combiner类,因为reducer类本身负责combiner任务。

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

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

enxuqcxy

enxuqcxy3#

合路器在Map输出上运行。在你的例子中,Map输出是这样的,

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

因此,它将针对每个键运行,因此在您的示例中,java出现了两次,因此它生成的结果是(key,[逗号分隔的值])。

相关问题