Java hadoop中的reduce函数不';行不通

Java hadoop中的reduce函数不';行不通,java,hadoop,mapreduce,word-count,Java,Hadoop,Mapreduce,Word Count,我正在学习hadoop。我用Java写了一个简单的程序。程序必须对单词进行计数(并创建包含单词和每个单词出现次数的文件),但程序仅创建包含所有单词的文件,并在每个单词附近使用数字“1”。它看起来像: rmd 1 rmd 1 rmd 1 rmd 1 rmdaxsxgb-1 但我想: rmd 4 rmdaxsxgb-1 据我所知,它只适用于映射功能。(我试图对reduce函数进行注释,得到了相同的结果) 我的代码(这是mapreduce程序的一个典型示例;可以在internet或有关hado

我正在学习hadoop。我用Java写了一个简单的程序。程序必须对单词进行计数(并创建包含单词和每个单词出现次数的文件),但程序仅创建包含所有单词的文件,并在每个单词附近使用数字“1”。它看起来像:

  • rmd 1
  • rmd 1
  • rmd 1
  • rmd 1
  • rmdaxsxgb-1
但我想:

  • rmd 4

  • rmdaxsxgb-1

据我所知,它只适用于映射功能。(我试图对reduce函数进行注释,得到了相同的结果)

我的代码(这是mapreduce程序的一个典型示例;可以在internet或有关hadoop的书籍中轻松找到):

公共类字数{
公共静态类映射扩展映射器{
私有最终静态IntWritable one=新的IntWritable(1);
私有文本字=新文本();
公共void映射(LongWritable键、文本值、上下文上下文)引发IOException、InterruptedException{
字符串行=value.toString();
StringTokenizer标记器=新的StringTokenizer(行);
while(tokenizer.hasMoreTokens()){
set(tokenizer.nextToken());
上下文。写(单词,一);
}
}
} 
公共静态类Reduce扩展Reducer{
公共void reduce(文本键、迭代器值、上下文)
抛出IOException、InterruptedException{
整数和=0;
while(values.hasNext()){
sum+=values.next().get();
}
write(key,newintwriteable(sum));
}
}
公共静态void main(字符串[]args)引发异常{
Configuration conf=新配置();
Job Job=新作业(conf,“wordcount”);
job.setJarByClass(WordCount.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
setInputFormatClass(TextInputFormat.class);
setOutputFormatClass(TextOutputFormat.class);
addInputPath(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
job.waitForCompletion(true);
} }

我在amazon web服务上使用hadoop,但不明白为什么它不能正常工作。

看起来hadoop集群中没有运行reducer。 您可以用三种方式设置它。您可以在mapred-site.xml中进行设置。将属性设置为

<property>
 <name>mapred.reduce.tasks</name>
 <value>1</value>
</property>
或者在主类中定义它

  job.setNumReduceTasks(1);

要为所有作业永久设置该属性,您应该在mapred site.xml中设置该属性。

这可能是因为API的混合和匹配。hadoop有两个API,较早的是
mapred
,最新的是
mapreduce

在最新的API中,与代码中的
迭代器(旧API)相比,reducer将值处理为
Iterable

试试-

public class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,
            Context context)
            throws IOException, InterruptedException {

        int sum = 0;
        for (IntWritable value:values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));

    }
}
公共类Reduce扩展Reducer{
@凌驾
受保护的void reduce(文本键、Iterable值、,
上下文(上下文)
抛出IOException、InterruptedException{
整数和=0;
for(可写入值:值){
sum+=value.get();
}
write(key,newintwriteable(sum));
}
}

谢谢,我试过了,这很有帮助,但是应该有
Iterable值
,您有一个打印错误。
  job.setNumReduceTasks(1);
public class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {

    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,
            Context context)
            throws IOException, InterruptedException {

        int sum = 0;
        for (IntWritable value:values) {
            sum += value.get();
        }
        context.write(key, new IntWritable(sum));

    }
}