为什么我们需要在Hadoop程序中明确设置输出键/值类?

时间:2011-09-18 11:44:58

标签: class input hadoop

在“Hadoop:The Definitive Guide”一书中,有一个带有以下代码的示例程序。

JobConf conf = new JobConf(MaxTemperature.class);  
conf.setJobName("Max temperature");  
FileInputFormat.addInputPath(conf, new Path(args[0]));  
FileOutputFormat.setOutputPath(conf, new Path(args[1]));  
conf.setMapperClass(MaxTemperatureMapper.class);  
conf.setReducerClass(MaxTemperatureReducer.class);  
conf.setOutputKeyClass(Text.class);  
conf.setOutputValueClass(IntWritable.class);  

MR框架应该能够从Mapper和在JobConf类上设置的Reduce函数中找出输出键和值类。为什么我们需要在JobConf类上显式设置输出键和值类?此外,输入键/值对没有类似的API。

1 个答案:

答案 0 :(得分:7)

原因是类型擦除[1]。您将输出K / V类设置为泛型。在作业设置期间(运行时,而不是编译时),这些泛型将被删除。

输入k / v类可以从输入文件中读取,在SequenceFiles的情况下,类在标题中 - 您可以在编辑器中打开序列文件时读取它们。 必须编写此标头,因为每个映射输出都是一个SequenceFile,因此您需要提供类。

[1] http://download.oracle.com/javase/tutorial/java/generics/erasure.html