Hadoop Map Reduce程序

如何解决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> {
        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,IntWritable> {
    public void reduce(Text key,Iterator<Text> values,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来显式提供此信息。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?