5

Hadoopバージョン:0.20.2(Amazon EMRの場合)

問題:以下に追加したマップフェーズ中に書き込むカスタムキーがあります。reduce呼び出し中に、特定のキーの値に対していくつかの単純な集計を行います。私が直面している問題は、reduce呼び出しでの値の反復中に、キーが変更され、その新しいキーの値を取得したことです。

私のキータイプ:

 class MyKey implements WritableComparable<MyKey>, Serializable {
    private MyEnum type; //MyEnum is a simple enumeration.
    private TreeMap<String, String> subKeys;

    MyKey() {} //for hadoop
    public MyKey(MyEnum t, Map<String, String> sK) { type = t; subKeys = new TreeMap(sk); }

    public void readFields(DataInput in) throws IOException {
      Text typeT = new Text();
      typeT.readFields(in);
      this.type = MyEnum.valueOf(typeT.toString());

      subKeys.clear();
      int i = WritableUtils.readVInt(in);
      while ( 0 != i-- ) {
        Text keyText = new Text();
        keyText.readFields(in);

        Text valueText = new Text();
        valueText.readFields(in);

        subKeys.put(keyText.toString(), valueText.toString());
    }
  }

  public void write(DataOutput out) throws IOException {
    new Text(type.name()).write(out);

    WritableUtils.writeVInt(out, subKeys.size());
    for (Entry<String, String> each: subKeys.entrySet()) {
        new Text(each.getKey()).write(out);
        new Text(each.getValue()).write(out);
    }
  }

  public int compareTo(MyKey o) {
    if (o == null) {
        return 1;
    }

    int typeComparison = this.type.compareTo(o.type); 
    if (typeComparison == 0) {
        if (this.subKeys.equals(o.subKeys)) {
            return 0;
        }
        int x = this.subKeys.hashCode() - o.subKeys.hashCode();
        return (x != 0 ? x : -1);
    }
    return typeComparison;
  }
}

このキーの実装に何か問題がありますか?以下は、reducecallでキーの取り違えに直面しているコードです。

reduce(MyKey k, Iterable<MyValue> values, Context context) {
   Iterator<MyValue> iterator = values.iterator();
   int sum = 0;
   while(iterator.hasNext()) {
        MyValue value = iterator.next();
        //when i come here in the 2nd iteration, if i print k, it is different from what it was in iteration 1.
        sum += value.getResult();
   }
   //write sum to context
}

これでどんな助けでも大いに感謝されるでしょう。

4

1 に答える 1

5

これは予想される動作です(少なくとも新しいAPIでは)。

値Iterableの基になるイテレータのnextメソッドが呼び出されると、ソートされたマッパー/コンバイナー出力から次のキー/値のペアが読み取られ、キーが前のキーと同じグループの一部であることが確認されます。

hadoopはreduceメソッドに渡されたオブジェクトを再利用するため(同じオブジェクトのreadFieldsメソッドを呼び出すだけ)、Keyパラメーター'k'の基本的な内容はvaluesIterableの反復ごとに変更されます。

于 2012-05-17T02:03:57.243 に答える