当我编写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
答案 0 :(得分:5)
setMapOutputKeyClass()以及setMapOutputValueClass()是可选的,只要它们分别与setOutputKeyClass()和setOutputValueClass()指定的作业输出类型相匹配即可。换句话说,如果您的映射器输出与您的reducer输出不匹配,则必须使用这些方法中的一种或两种。
关于泛型参数的问题,由于Java类型擦除(Java generics - type erasure - when and what happens),Hadoop在运行时并不知道它们,即使编译器已知它们。