【问题标题】:Class Cast exception for the Hadoop new APIHadoop 新 API 的 Class Cast 异常
【发布时间】:2012-07-18 23:09:29
【问题描述】:

我试图用 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)

这里是一个示例 sn-p 代码

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();
        }

请让我知道要进行哪些配置更改,以避免类转换异常。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    这通常发生在 MapReduce 尝试作为键/值传递的类型与 Map 或 Reduce 类模板化的类型不匹配时。

    您说您使用的是KeyvalueTextInputFormat,但在您的代码中您使用的是TextInputFormatTextInputFormat 传递记录为 <LongWritable, Text> : "position, line"。

    我猜你的 Mapper 的类型是<Text, Text, ?, ?>。因此,MapReduce 试图将 TextInputFormat 提供给 TextLongWritable 转换为 Text,但它不能,所以它被炸毁了。

    我建议您KeyvalueTextInputFormat 或将映射器的类型更改为<LongWritable, Text, ?, ?>

    【讨论】:

    • 嗨,谢谢你的回复。但我已经提到我之前使用过 KeyValueTextInputFormat 。这个类在我目前使用的新版本的 hadoop 中不存在。我已经修改了我的映射器到 Longwritable 现在.. 但我仍然很好奇如何避免类转换异常.. 在此先感谢
    • 什么意思你还在好奇如何避免呢?为避免这种情况,您需要确保映射器中的 <A, B, C, D> 模板类型与输入格式匹配。
    猜你喜欢
    • 2014-10-23
    • 2018-05-14
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多