Hadoop Map Reduce程序

| 当我尝试基于Hadoop 0.20 API的Hadoop in Action书中的Map Reduce编程示例时,出现了错误 java.io.IOException:类型与地图中的值不匹配:预期的org.apache.hadoop.io.IntWritable,收到的org.apache.hadoop.io.Text 但据我检查,我通过的一切都正确。如果有人可以帮助我,那将真的很有帮助。 这是代码。它与书中的代码相同。
@SuppressWarnings(\"unused\")
public class CountPatents extends Configured implements Tool {
    @SuppressWarnings(\"deprecation\")

    public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text> {
        public void map(Text key, Text value,OutputCollector<Text, Text> output,Reporter reporter) throws IOException {
            output.collect(value, key);
        }
    }
public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, IntWritable> {
    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
        int count=0;
        while(values.hasNext()){
            count=count+1;

            values.next();

        }


        output.collect(key, new IntWritable(count));
    }
}


    public int run(String[] args) throws Exception {

    Configuration conf = getConf();
    JobConf job = new JobConf(conf, CountPatents.class);
    Path in = new Path(args[0]);
    Path out = new Path(args[1]);
    FileInputFormat.setInputPaths(job, in);
    FileOutputFormat.setOutputPath(job, out);
    job.setJobName(\"MyJob\");
    job.setMapperClass(MapClass.class);
    job.setReducerClass(Reduce.class);
    job.setInputFormat(KeyValueTextInputFormat.class);
    job.setOutputFormat(TextOutputFormat.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(Text.class);
    job.set(\"key.value.separator.in.input.line\", \",\");
    JobClient.runJob(job);
    return 0;
    }
    public static void main(String[] args) throws Exception {
        int res = ToolRunner.run(new Configuration(), new CountPatents(), args);
        System.exit(res);


    }

    }
    
已邀请:
        快速浏览(不在本地运行代码),看起来您在设置
job.setOutputValueClass(Text.class);
时将作业的输出设置为文本类型,但是化简器的输出类型设置为IntWritable。这很可能是错误。     
        未接来电: job.setMapOutputValueClass(IntWritable.class); 使用新的0.20接口和新的\“ Job \”对象代替JobConf时,也会出现相同的问题。     
        减速器的输出中应该有错误: 您的资源类定义如下: 公共静态类Reduce扩展MapReduceBase实现Reducer 因此输出值应为IntWritable类型。 但是,您提到了 job.setOutputValueClass(Text.class); 因此,按照配置,reducer的输出应为Text。 解: 在配置中,添加以下行  job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); 和修改: job.setOutputValueClass(IntWritable.class); 然后尝试运行     
        地图发出 这样设置
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
setMapOutputKeyClass setMapOutputValueClass     
        在化简函数中,您正在使用OutputCollector,这意味着Output键类的类型为Text,而Output value类的类型为IntWritable。 但是,在主(运行)功能中,您已经设置了job.setOutputKeyClass(Text.class);。 job.setOutputValueClass(Text.class);。 将job.setOutputValueClass(Text.class)更改为job.setOutputValueClass(IntWritable.class),您就可以开始了! 另外,最好设置MapperOutputKeyType和MapperOutputValueType以避免任何差异。 Hadoop使用基于可写接口的机制而不是本机Java序列化机制。与Java序列化机制不同,此方法不会将类名封装在序列化的实体中。因此,需要显式的类名才能将这些类从Mapper实例化为Reducer,因为在不知道将类反序列化为(Reducer输入键和值实例)的情况下,无法对表示可写实例的字节数组进行反序列化是不可能的。需要通过在Job实例上调用setMapOutputKeyClass和setMapOutputValueClass来显式提供此信息。     

要回复问题请先登录注册