在单词计数示例中,约简函数被用作组合器和减速器。
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));
}
}我理解还原器的工作方式,但在组合器的情况下,假设我的输入是
<Java,1> <Virtual,1> <Machine,1> <Java,1>它考虑了第一对kv,并给出了相同的输出.!!?因为我只有一个价值。为什么它同时考虑了两个键
<Java,1,1> 既然我们一次只考虑一个kv对?我知道这是一个错误的假设,请有人纠正我。
发布于 2016-11-23 05:43:17
IntSumReducer类继承了Reducer类和Reducer类,在这里可以看到文档
“将共享密钥的一组中间值缩减为一组较小的值,还原器实现可以通过JobContext.getConfiguration()方法访问作业的配置。 减速器有三个主要阶段: 清除: Reducer通过网络使用HTTP复制来自每个Mapper的排序输出。 排序:框架合并按键对减速器输入进行排序(因为不同的映射程序可能输出相同的键)。 洗牌和排序阶段同时进行,即在获取输出时,它们被合并。“
调用同一个类的程序,用于合并和减少操作;
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.class);所以我想出的是,如果我们只使用一个数据节点,我们不一定要为这个字计数程序调用组合器类,因为还原器类本身负责组合器的工作。
job.setMapperClass(TokenizerMapper.class);
job.setReducerClass(IntSumReducer.class);如果只使用一个数据节点,上述方法对字计数程序也有相同的影响。
发布于 2016-10-14 07:12:32
在发送给减速器之前,组合器首先组合映射结果。
主机上的映射器可以输出许多相同的kv对键。和组合意志
在发送到减速机之前,先合并map输出,从而减少
映射器和减速器之间的洗牌成本。
因此,如果映射器具有输出(key,1) (key,1),组合器将将结果组合为(key ,1,1)。
发布于 2016-10-14 07:14:36
组合器在Map输出上运行。在您的case Map输出中,
<Java,1> <Virtual,1> <Machine,1> <Java,1>,因此,它将为每个键运行,因此在您的示例中,Java出现了两次,因此它生成的结果为(Key,逗号分隔的值)。
https://stackoverflow.com/questions/40036518
复制相似问题