Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误的键类:文本不可写_Java_Hadoop_Mapreduce - Fatal编程技术网

Java 错误的键类:文本不可写

Java 错误的键类:文本不可写,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,这似乎是一个愚蠢的问题,但我在hadoop的mapreduce代码中没有看到类型中的问题 如问题中所述,问题在于它期望IntWritable,但我正在reducer的collector.collect中向它传递一个文本对象 我的作业配置具有以下映射器输出类: conf.setMapOutputKeyClass(IntWritable.class); conf.setMapOutputValueClass(IntWritable.class); conf.setOutputKeyClass(Te

这似乎是一个愚蠢的问题,但我在hadoop的mapreduce代码中没有看到类型中的问题

如问题中所述,问题在于它期望IntWritable,但我正在reducer的collector.collect中向它传递一个文本对象

我的作业配置具有以下映射器输出类:

conf.setMapOutputKeyClass(IntWritable.class);
conf.setMapOutputValueClass(IntWritable.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
和以下减速器输出等级:

conf.setMapOutputKeyClass(IntWritable.class);
conf.setMapOutputValueClass(IntWritable.class);
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
我的映射类具有以下定义:

public static class Reduce extends MapReduceBase implements Reducer<IntWritable, IntWritable, Text, IntWritable>
我对map reduce相当陌生,但所有类型似乎都匹配,它编译了,但在那一行失败了,因为它希望一个IntWritable作为reduce类的键。如果重要的话,我使用的是0.21版本的Hadoop

这是我的地图课:

public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, IntWritable, IntWritable> {
    private IntWritable node = new IntWritable();
    private IntWritable edge = new IntWritable();

    public void map(LongWritable key, Text value, OutputCollector<IntWritable, IntWritable> output, Reporter reporter) throws IOException {
        String line = value.toString();
        StringTokenizer tokenizer = new StringTokenizer(line);

        while (tokenizer.hasMoreTokens()) {
            node.set(Integer.parseInt(tokenizer.nextToken()));
            edge.set(Integer.parseInt(tokenizer.nextToken()));
            if(node.get() < edge.get())
                output.collect(node, edge);
        }
    }
}

您的问题是将Reduce类设置为组合器

conf.setCombinerClass(Reduce.class);
组合器在映射阶段运行,它们需要发出相同的键/值类型(在您的情况下为IntWriteable、IntWriteable)
去掉这条线,你应该会没事的

它看起来不错。你能发布邮件、映射和reduce类吗?虽然我是hadoop新手,不知道邮件类是什么,但我刚刚用映射和reduce类更新了这个问题?我是通过修改WordCount示例来实现的,我认为它不包括该类。嗯,我稍后会尝试一下,看看它是否有效,我之所以这么做,是因为这一行在WordCount示例中,我还有其他map reduce作业使用了这一行,我没有遇到任何问题。它还没有完成运行,但它肯定已经解决了我遇到的问题。答案被接受。不过,有一件事,为什么hadoop网站上的WordCount示例中会用到它呢?映射器和组合器的o/p被馈送到还原器。在代码中,组合器的o/p是Text/IntWritable,而减速机的输入是IntWritable/IntWritable,这两个输入不匹配,因此会出现错误。请参见“为什么合并器”。总而言之,它们通过使映射任务对本地可用的数据做更多的工作,从而将更少的数据传输到还原器,从而使作业运行速度更快。@user1084563合并器作为映射的一部分运行(即在数据所在的计算机上运行)如果您可以使用它们,这意味着一个更高效的过程,因为您不必将数据发送到reducer。在单词计数示例中,映射为遇到的每个单词发出1,合并器对同一节点上每个单词的数量求和,然后缩减器生成所有集群的总数。在本例中,合并器和reduce都执行相同的逻辑并共享相同的签名,因此它们可以是一个类。
JobConf conf = new JobConf(Triangles.class);
conf.setJobName("mapred1");

conf.setMapOutputKeyClass(IntWritable.class);
conf.setMapOutputValueClass(IntWritable.class);

conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);

conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);

conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);

FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path("mapred1"));

JobClient.runJob(conf);
conf.setCombinerClass(Reduce.class);