为什么在Mapreduce作业中需要setMapOutputKeyClass方法

时间:2016-07-14 14:18:36

标签: types mapreduce

当我编写mapreduce程序时,我经常编写像

这样的代码
 job1.setMapOutputKeyClass(Text.class); 

但是为什么我们要明确指定MapOutputKeyClass?我们已经在mapper类中进行了spicify,例如

public static class MyMapper extends
        Mapper<LongWritable, Text, Text, Text>

在Hadoop:权威指南一书中,有一个表显示方法setMapOutputKeyClass是可选的(属性用于配置类型),但是当我测试时,我发现它是必要的,或者eclipse的控制台会显示

Type mismatch in key from map: expected org.apache.hadoop.io.LongWritable, received org.apache.hadoop.io.Text

有人可以告诉我它的原因吗?

在书中,它说

&#34;必须与MapReduce类型兼容的设置列于表8-1和#34;的下半部分。 这是否意味着我们必须设置下部属性类型,但不必设置较高部分属性?

表的内容如下所示:

Properties for configuring types:
mapreduce.job.inputformat.class  
mapreduce.map.output.key.class  
mapreduce.map.output.value.class  
mapreduce.job.output.key.class  
mapreduce.job.output.value.class 

Properties that must be consistent with the types:
mapreduce.job.map.class   
mapreduce.job.combine.class  
mapreduce.job.partitioner.class  
mapreduce.job.output.key.comparator.class 
mapreduce.job.output.group.comparator.class  
mapreduce.job.reduce.class  
mapreduce.job.outputformat.class

1 个答案:

答案 0 :(得分:5)

setMapOutputKeyClass()以及setMapOutputValueClass()是可选的,只要它们分别与setOutputKeyClass()和setOutputValueClass()指定的作业输出类型相匹配即可。换句话说,如果您的映射器输出与您的reducer输出不匹配,则必须使用这些方法中的一种或两种。

关于泛型参数的问题,由于Java类型擦除(Java generics - type erasure - when and what happens),Hadoop在运行时并不知道它们,即使编译器已知它们。