减速机卡在70%



我正在用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));
    }

你永远不会在迭代器上调用next(),所以你基本上是在创建一个无限循环。


作为旁注,实现这个单词计数示例的首选方法不是将计数增加1,而是使用该值:
IntWritable value = values.next();
count += value.get();

这样,您可以将Reducer重用为Combiner,以便它将为每个映射器计算部分计数,并向reducer发出("wordX",7),而不是从给定的映射器发出7次("wordX",1)。

相关内容

  • 没有找到相关文章

最新更新