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

Pra*_*ati 6 hadoop class input

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

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

Tho*_*lut 8

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

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

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