Hadoop Map减少程序

时间:2011-03-23 23:19:38

标签: eclipse map hadoop reduce

当我尝试基于Hadoop 0.20 API的Hadoop in Action手册中的Map Reduce编程示例时,我收到了错误

java.io.IOException:输入map中的值不匹配:expected org.apache.hadoop.io.IntWritable,recieved 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);


    }

    }

5 个答案:

答案 0 :(得分:8)

从快速查看(不在本地运行代码),看起来您在设置job.setOutputValueClass(Text.class);时将作业的输出设置为Text类型,但reducer上的输出类型设置为IntWritable。这可能是错误。

答案 1 :(得分:0)

错过了一个电话:

job.setMapOutputValueClass(IntWritable.class);

使用新的0.20界面和新的“Job”对象代替JobConf时出现同样的问题。

答案 2 :(得分:0)

错误应该来自reducer的输出:

您的课程定义如下:

public static class Reduce extends MapReduceBase实现Reducer

因此输出值应为IntWritable类型。

但是,你已经提到了 job.setOutputValueClass(Text.class);

因此,根据配置,reducer的输出应为Text。

解决方案: 在配置中,添加以下行  job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class);

并修改: job.setOutputValueClass(IntWritable.class);

然后尝试运行

答案 3 :(得分:0)

地图发出&lt;文字,文字&gt;

所以设置

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);

setMapOutputKeyClass setMapOutputValueClass

答案 4 :(得分:0)

在reducer函数中,您使用的是OutputCollector,这意味着Output键类的类型为Text,输出值类的类型为IntWritable。 但是在main(run)函数中,你设置了job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class);

将job.setOutputValueClass(Text.class)更改为job.setOutputValueClass(IntWritable.class),你很高兴!

另外,最好设置MapperOutputKeyType和MapperOutputValueType以避免任何差异。 Hadoop使用基于可写接口的机制而不是本机Java序列化机制。与Java Serialization机制不同,此方法不会将类名封装在序列化实体中。因此,需要显式类名来将这些类从Mapper实例化为Reducer,因为无法将表示Writable实例的字节数组反序列化而不知道将类反序列化为(Reducer输入键和值实例)。需要通过在Job实例上调用setMapOutputKeyClass和setMapOutputValueClass来显式提供此信息