Hadoop中Reducer的错误输入值

时间:2013-01-10 23:21:09

标签: hadoop mapreduce

我已经定义了一个自定义可写(称为 EquivalenceClsAggValue ),它在Hadoop中有一个ArrayList类型的字段(称为 aggValues )。使用我的测试数据,Mapper在2中每个输出条目的 aggValues 的大小。但是,当我在Reducer中检查 aggValues 的大小时,它给了我不同的尺寸!也就是说,大小累积(第一个元素具有2,第二个元素具有大小4,第三个元素具有大小6,依此类推)。可能是什么问题?

这是我在Mapper中输出的方式:

EquivalenceClsAggValue outputValue = new EquivalenceClsAggValue();
                .....

output.collect(new IntWritable(outputValue.aggValues.size()),outputValue);

在减速器中:

public void reduce(IntWritable key, Iterator<EquivalenceClsAggValue> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
     while(values.hasNext()){
            EquivalenceClsAggValue e = values.next();
            output.collect(new Text(key.toString()), new IntWritable(e.aggValues.size()));
.....

,输出为:

2 2

2 4

2 6

1 个答案:

答案 0 :(得分:0)

readFields方法中,您需要清除数组列表的任何先前内容 - Hadoop在调用之间重新使用相同的对象。

抱歉,我错过了your previous post

@Override
public void readFields(DataInput arg0) throws IOException {
  // add this statement to clear out previous contents
  aggValues.clear();

  int size = arg0.readInt();

  for (int i=0;i<size;i++){
    SortedMapWritable tmp = new SortedMapWritable();
    tmp.readFields(arg0);
    aggValues.add(tmp);
  }       
}