Hadoop新API的类Cast异常

时间:2012-07-18 12:27:25

标签: java hadoop mapreduce

我试图使用Map reduce框架来解决一些简单的代码。以前我使用mapred包实现了,我能够将输入格式类指定为KeyvalueTextInputFormat但是在使用mapreduce的新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异常。

1 个答案:

答案 0 :(得分:1)

当MapReduce试图通过键/值传递的类型不匹配以及Map或Reduce类的模板类型不匹配时,通常会发生这种情况。

您说您使用的是KeyvalueTextInputFormat,但在您的代码中,您使用的是TextInputFormatTextInputFormat将记录显示为<LongWritable, Text>:“position,line”。

我猜你的Mapper的类型是<Text, Text, ?, ?>。因此,MapReduce正在尝试投放LongWritable TextInputFormatText投放到KeyvalueTextInputFormat,但它不能,所以它会爆炸。

我建议您<LongWritable, Text, ?, ?>或将地图工具的类型更改为{{1}}。