5

複数の map() 呼び出しで使用できるメンバー オブジェクトを追加できるかどうか疑問に思っています。たとえば、StringBuilder:

private StringBuilder builder;

public void map(...){
    ...

    builder.setLength(0);
    builder.append(a);
    builder.append(b);
    builder.append(c);
    d = builder.toString();

    ...
}

明らかに、マッパー オブジェクトが複数のスレッドで共有されている場合、上記のビルダー オブジェクトは、複数のスレッドから同時にアクセスされるため、期待どおりに動作しません。

私の質問は、hadoop の各スレッドが専用のマッパー オブジェクトを 1 つ使用することは保証されているのでしょうか? それとも設定可能な動作ですか?

ありがとう

4

2 に答える 2

2

クラスを使用しているのではなく、独自のクラスを使用している限り、MultithreadedMapper問題はありません。map()は、並列ではなく順次と呼ばれます。

StringBuilder呼び出しの間にいくつかのオブジェクトをバッファリングするために、または他のデータ構造を使用するのが一般的です。ただし、入力オブジェクトからオブジェクトを複製するようにしてください。オブジェクトは 1 つしかなく、大量の GC を防ぐために何度も塗りつぶされます。

そのため、競合状態を同期したり処理したりする必要はありません。

于 2012-04-16T05:46:27.967 に答える
0

それは不可能だと思います。その理由は、各マッパーが独自の JVM で実行される (異なるマシンに分散される) ため、複数のマッパーまたはリデューサー間で変数またはオブジェクトを簡単に共有する方法がないためです。

すべてのマッパーが同じノードで実行されている場合、どこかに JVM 再利用の構成があると思いますが、特に必要なものがStringBuilder:)

以前にこの質問を見たことがありますが、アプリケーションの設計を変更することで非常に簡単に解決できます。これが本当に必要かどうかを確認するために、これで達成しようとしていることについて詳しく説明できるかもしれません。本当に必要な場合は、オブジェクトをシリアル化して HDFS に配置し、各マッパーで読み取り、逆シリアル化することもできますが、それは逆のようです。

于 2012-04-16T02:58:54.563 に答える