Hadoop 减速器卡在70%

Hadoop 减速器卡在70%,hadoop,mapreduce,Hadoop,Mapreduce,我正在用hadoop完成一个非常初始的编程任务,并着手解决经典的字数问题 已经在hdfs上放置了一个示例文件,并尝试在其上运行wordcount。映射器通过得很好,但是,减速器卡在70%的位置,从未向前移动 我也用本地文件系统上的文件尝试了这个方法,得到了同样的结果 我可能做错了什么? 以下是map和reduce函数- public void map(LongWritable key, Text value, OutputCollector<Text, IntWritabl

我正在用hadoop完成一个非常初始的编程任务,并着手解决经典的字数问题

已经在hdfs上放置了一个示例文件,并尝试在其上运行wordcount。映射器通过得很好,但是,减速器卡在70%的位置,从未向前移动

我也用本地文件系统上的文件尝试了这个方法,得到了同样的结果

我可能做错了什么? 以下是map和reduce函数-

public void map(LongWritable key, Text value,
        OutputCollector<Text, IntWritable> output, Reporter reporter)
        throws IOException {
    // TODO Auto-generated method stub
    String line = value.toString();

    String[] lineparts = line.split(",");

    for(int i=0; i<lineparts.length; ++i)
    {
        output.collect(new Text(lineparts[i]), new IntWritable(1));
    }


public void reduce(Text key, Iterator<IntWritable> values,
              OutputCollector<Text, IntWritable> output, Reporter reporter)
            throws IOException {
        // TODO Auto-generated method stub
        int count = 0;
        while(values.hasNext())
        {
            count=count+1;
        }
        output.collect(key , new IntWritable(count));
    }
public void映射(可长写键、文本值、,
OutputCollector输出,报告器(报告器)
抛出IOException{
//TODO自动生成的方法存根
字符串行=value.toString();
String[]lineparts=line.split(“,”);
对于(inti=0;i您从未在迭代器上调用
next()
,因此您基本上创建了一个无限循环


作为旁注,实现此单词计数示例的首选方法不是将计数增加
1
,而是使用以下值:

IntWritable value = values.next();
count += value.get();
通过这种方式,您可以将
减速机
重新用作
组合器
,这样它将计算每个映射器的部分计数,并向减速机发出(“wordX”,7),而不是从给定映射器发出7次(“wordX”,1)。您可以阅读有关组合器的更多信息。

您永远不会调用
next()
在迭代器上,因此基本上创建了一个无限循环


作为旁注,实现此单词计数示例的首选方法不是将计数增加
1
,而是使用以下值:

IntWritable value = values.next();
count += value.get();
通过这种方式,您可以将
减速机
重新用作
组合器
,这样它将计算每个映射器的部分计数,并向减速机发出(“wordX”,7),而不是从给定映射器发出7次(“wordX”,1)。您可以阅读有关组合器的更多信息