【发布时间】:2015-11-23 10:07:08
【问题描述】:
Hadoop MapReduce 中的Combiner 逻辑是否始终与Reducer 逻辑相同?或者有没有Combiner逻辑可以不同于Reducer逻辑的场景?
【问题讨论】:
Hadoop MapReduce 中的Combiner 逻辑是否始终与Reducer 逻辑相同?或者有没有Combiner逻辑可以不同于Reducer逻辑的场景?
【问题讨论】:
但是Combiner和Reducer都必须通过扩展Reducer来实现reduce()方法
例如
public void reduce(Key key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
如果Combiner 和Reducer 都不同,则将这些类设置如下
job.setCombinerClass(YourCombiner.class);
job.setReducerClass(YourReducer.class);
【讨论】:
没有。您可以指定所需的任何组合器功能。我建议您阅读 Mahout in action book,在第 32 页您可能会找到一些相关信息。示例:
public class MaxTemperatureWithCombiner {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println("Usage: MaxTemperatureWithCombiner <input path> " +
"<output path>");
System.exit(-1);
}
JobConf conf = new JobConf(MaxTemperatureWithCombiner.class);
conf.setJobName("Max temperature");
FileInputFormat.addInputPath(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
conf.setMapperClass(MaxTemperatureMapper.class);
conf.setCombinerClass(MaxTemperatureReducer.class);
conf.setReducerClass(MaxTemperatureReducer.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
JobClient.runJob(conf);
}
}
注意你调用了 conf.setCombinerClass(MaxTemperatureReducer.class); 所以你可以指定任何你想要的组合函数。通常 combiner 和 reducer 具有相同的逻辑,但并非总是如此。
【讨论】:
在大多数情况下,Combiner 逻辑与 reducer 逻辑相同。虽然我们也可能有与 reducer 不同的组合器逻辑。
Combiner 必须与 reducer 具有相同的输入类型。
Combiner 将合并每个地图输出的结果。由于这个原因,一些值在映射器阶段本身被组合,并且由于这种网络流量显着减少,因为需要从映射器遍历到减速器的值更少。
【讨论】: