2012-04-16 2 views
5

複数のmap()呼び出しで使用できるメンバーオブジェクトを追加できるかどうかは疑問です。たとえば、StringBuilderのは:マッパーオブジェクトを複数のスレッド間で共有されている場合複数のスレッドで共有されるHadoopのMapperオブジェクトですか?

private StringBuilder builder; 

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

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

    ... 
} 

明らかに、ビルダーの目的は、上記により、複数のスレッドからの同時アクセスに期待どおりに動作しません。

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

ありがとうございました

答えて

2

MultithreadedMapperクラスを使用していない限り問題はありません。 map()はシーケンシャルと呼ばれ、パラレルではありません。

一般に、StringBuilderやその他のデータ構造を使用して、呼び出しの間にいくつかのオブジェクトをバッファリングします。 しかし、あなたの入力オブジェクトからオブジェクトをクローンしてください。一つのオブジェクトしかありません。たくさんのGCを防ぐために、オブジェクトは1つしかなく、何度も何度も繰り返し埋められます。

したがって、競合状態を同期させる必要はありません。

+0

これは私が知りたいことです。ありがとう。 – JRaSH

+1

Key/Valueオブジェクト全体が必要な場合は、オブジェクトをクローンするだけで済みます。そうでない場合は、StringBufferに追加するコンテンツの一部が必要な場合は問題ありません。あなたが地図呼び出しの間にバッファリングしているものをReducerにフラッシュ/書き込むクリーンアップメソッドを追加することを忘れないでください。そうしないと、Reducersに送信されないデータがいくつか残ってしまいます。 – Drizzt321

0

私はそうは考えていません。その理由は、各マッパーがそれぞれのJVM(異なるマシンに分散される)で動作するため、複数のマッパーやレデューサー間で変数やオブジェクトを簡単に共有できる方法がないからです。すべてのマッパーが同じノード上で実行する場合

は今、私はあなたが必要とするすべてはStringBuilderある場合は特に:)

、どこかで再利用し、正直なところ、私はそれを気にしないだろうJVM用の設定があると信じてこれまで一度この質問がありましたが、アプリケーションの設計を変更することで非常に簡単に解決できます。たぶんあなたはこれで本当に必要かどうかを確認するためにこれで達成しようとしていることをもっと知ることができます。本当に必要な場合は、オブジェクトをシリアル化してHDFSに入れ、各マッパーで読み込み、逆シリアル化することができますが、それは逆になります。

+0

こんにちは、複数のマッパーで変数を共有するわけではありません。私の知る限り、各マッパーのmap()メソッドは複数回呼び出されます。これは、私がいくつかのリソースを節約できると思うところです。だから、メンバーオブジェクトをマッパーインスタンスに置くことによって、このオブジェクトは、initとde-initを何度も何度も何度も繰り返していなくても、複数のmap()呼び出しにまたがってresuedすることができます。私の懸念は:map()が同時に呼び出された場合、memeberオブジェクトの使用に問題が発生する可能性があります。 – JRaSH

関連する問題