在Map-Reduce中,是否可以在Mappers,Combiners和Reducers之间传播不同类型的键。
例如,如果我有一个映射器(用Java实现),它输出Text,IntWritable作为键/值对。 然后,在组合器中,我将所有输出合并为单个键,并希望将其输出为NullWritable,Text。 然后在Reducer中,我想输出Text,IntWritable。
是否有可能做上面这样的事情?如果没有,为什么?
答案 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:
答案 2 :(得分:0)
Hadoop使用Combiner来优化处理,但不保证Combiner的执行。因此,您无法假设,Hadoop可以直接将地图输出数据发送到Reducer阶段。
关于此问题的讨论,我建议阅读this book的第3章。在PDF文件的第48页中关于该问题的评论。