Mapper&中的不同键合路器

时间:2015-01-12 09:58:58

标签: java hadoop

在Map-Reduce中,是否可以在Mappers,Combiners和Reducers之间传播不同类型的键。

例如,如果我有一个映射器(用Java实现),它输出Text,IntWritable作为键/值对。 然后,在组合器中,我将所有输出合并为单个键,并希望将其输出为NullWritable,Text。 然后在Reducer中,我想输出Text,IntWritable。

是否有可能做上面这样的事情?如果没有,为什么?

3 个答案:

答案 0 :(得分:0)

您可以使用方法为mapper和reducer指定不同的键/值类型:

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);

但是您无法为合并器设置与mapper不同的键/值类型。这是因为组合器仅用于减少从映射器发送到reducer的数据量。您应该能够移除合成器而没有任何副作用。但是如果你的组合器产生NullWritable, Text对并且mapper产生Text, IntWritable对,那么你的程序将在没有组合器的情况下失败。

答案 1 :(得分:0)

您可以使用Text而不是IntWritable:

  • 映射器输出:文本,文本
  • 组合器:文字,文字。可以使用Combiner输出键NullWritable。
  • 减速机输入:文字,文字

答案 2 :(得分:0)

Hadoop使用Combiner来优化处理,但不保证Combiner的执行。因此,您无法假设,Hadoop可以直接将地图输出数据发送到Reducer阶段。

关于此问题的讨论,我建议阅读this book的第3章。在PDF文件的第48页中关于该问题的评论。