作为旁注,实现这个单词计数示例的首选方法不是将计数增加
我正在用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)。