2

Hadoop で ArrayList 型 ( aggValuesと呼ばれる) のフィールドを持つカスタム書き込み可能 ( EquivalenceClsAggValueと呼ばれる) を定義しました。私のテスト データを使用すると、Mapper による各出力エントリのaggValuesのサイズは 2 です。ただし、Reducer でaggValuesのサイズを確認すると、サイズが異なります。つまり、サイズが累積されます (最初の要素のサイズは 2、2 番目の要素のサイズは 4、3 番目の要素のサイズは 6 など)。何が問題になる可能性がありますか?

これは、マッパーで出力する方法です。

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

4

1 に答える 1

0

readFieldsメソッドでは、配列リストの以前の内容を消去する必要があります。Hadoop は呼び出し間で同じオブジェクトを再利用します。

申し訳ありませんが、以前の投稿でこれを見逃していました:

@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);
  }       
}
于 2013-01-11T00:01:36.337 に答える