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

Coi*_*igh 1 types mapreduce

当我编写mapreduce程序时,我经常编写代码

 job1.setMapOutputKeyClass(Text.class); 
Run Code Online (Sandbox Code Playgroud)

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

public static class MyMapper extends
        Mapper<LongWritable, Text, Text, Text>
Run Code Online (Sandbox Code Playgroud)

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

Type mismatch in key from map: expected org.apache.hadoop.io.LongWritable, received org.apache.hadoop.io.Text
Run Code Online (Sandbox Code Playgroud)

有人能告诉我它的原因吗?

在书中,它说

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

表的内容如下所示:

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
Run Code Online (Sandbox Code Playgroud)

yur*_*gis 5

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

至于关于泛型参数的问题,由于Java类型擦除(Java泛型 - 类型擦除 - 何时以及发生了什么),Hadoop在运行时并不知道它们,即使编译器已知它们.