我尝试使用Map-reduce框架编写一些简单的代码。以前我使用mapreduce包实现了,我可以将输入格式类指定为KeyvalueTextInputFormat,但在使用mapreduct的新Api中,这个类不存在。我尝试使用TextInputFormat.class,但仍然得到以下异常
- job_local_0001
java.lang.ClassCastException: org.apache.hadoop.io.LongWritable cannot be cast to org.apache.hadoop.io.Text
at com.hp.hpl.mapReduceprocessing.MapReduceWrapper$HitFileProccesorMapper_internal.map(MapReduceWrapper.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:621)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:305)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177)
这是代码的一个示例片段
Configuration conf = new Configuration();
conf.set("key.value.separator.output.line", ",");
Job job = new Job(conf, "Result Aggregation");
job.setJarByClass(ProcessInputFile.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setMapperClass(MultithreadedMapper.class);
MultithreadedMapper.setMapperClass(job, HitFileProccesorMapper_internal.class);
MultithreadedMapper.setNumberOfThreads(job, 3);
//job.setMapperClass(HitFileProccesorMapper_internal.class);
job.setReducerClass(HitFileReducer_internal.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(inputFileofhits.getName()));
FileOutputFormat.setOutputPath(job, new Path(ProcessInputFile.resultAggProps
.getProperty("OUTPUT_DIRECTORY")));
try {
job.waitForCompletion(true);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
请告诉我要做的配置更改是什么,这样可以避免classcast异常。
当MapReduce试图作为键/值传递的内容与Map或Reduce类模板化后的内容存在类型不匹配时,通常会发生这种情况。
您说您使用的是KeyvalueTextInputFormat
,但在代码中您使用的却是TextInputFormat
。TextInputFormat
以<LongWritable, Text>
的形式传递记录:"位置,行"。
我猜你的Mapper的类型是<Text, Text, ?, ?>
。因此,MapReduce正试图将LongWritable
强制转换为TextInputFormat
赋予的Text
,但它做不到,所以它爆炸了。
我建议您使用KeyvalueTextInputFormat
或将映射器的类型更改为<LongWritable, Text, ?, ?>
。