2011-07-24 10 views
2

org.apache.hadoop.mapreduce.Jobがスレッドセーフであるかどうかは誰でも知っていますか?私のアプリケーションでは、ジョブごとにスレッドを作成し、次にwaitForCompletionを作成します。私はisCompleteですべてのジョブの状態をチェックする別のモニタースレッドを持っています。hadoopの仕事はThreadSafeですか?

これは安全ですか?ジョブはスレッドセーフですか?ドキュメントは

おかげで...それについては何も言及していないようだ のUdi

答えて

3

他のスレッドとは異なり、スレッドを使用して並列にジョブをサブミットし、その完了を待ちます。スレッドごとにジョブクラスインスタンスを使用するだけです。同じジョブインスタンスを複数のスレッドで共有する場合は、自分で同期を行う必要があります。

+0

ありがとう@トーマス、私はそう思った... – Udi

+0

あなたはparralelでジョブを実行するスケジューラを使用していますか? –

+0

@David Grunzmanはい、それは石英と依存する仕事の鎖の混合物です、それらのいくつかは並行して走りますので、私はそれを並行して提出します。 –

0

なぜあなたはジョブごとに個別のスレッドを書きたいのでしょうか?あなたのユースケースは何ですか?

Hadoopクラスタで複数のジョブを実行できます。複数のジョブ間に依存関係はありますか?

ジョブが10個実行されているとします。 1ジョブが失敗した場合は、9つの成功したタスクを再実行する必要があります。

最後に、ジョブトラッカーは、Hadoopクラスタ上の複数のジョブのスケジューリングを行います。依存関係がない場合は、スレッドの安全性について心配するべきではありません。依存関係がある場合は、デザインを再考する必要があります。

+0

私はJob.waitForCompletion()を使用しています。このメソッドは、完了するまでIOブロックです。 1つのスレッドですべてを実行すると、スレッドはシリアルで実行され、並列には実行されません。 – Udi

+0

タスクをタスクと混同します。 –

-1

ジョブが終了したかどうかを確認しているなら、マップの縮小の仕組みについてちょっと混乱していると思います。あなたはHadoopにそれをさせるべきです。

+1

私は同意しません。私の場合は、フロー内で複数のジョブを1つずつ実行するコンポーネントがあります。一部のジョブでは、その特定のジョブが失敗した場合にプロセスを終了したい(end-2-end)。 別のケースでは、HBaseテーブルからいくつかのジョブのステータス情報を読み取り、特定のjob_idを持つジョブが終了したかどうかを確認するカスタムHadoopコードを呼び出す必要があります。そうでなければ、HBaseテーブルにステータス情報は残っていません。 – Zec

0

はい、実際はファイルはブロックで分割され、各ブロックは別々のノードで実行されます。すべてのマップタスクは並行して実行され、実行後に減速機に供給されます。マルチスレッドプログラムで考えるように、同期の問題はありません。マルチスレッドプログラムでは、すべてのスレッドが同じボックスで実行されているため、それらのスレッドはデータの一部を共有しているため、同期させる必要があります。

0

マップタスクレベルで別の種類の並列処理が必要な場合は、 )メソッドを使用して、複数のスレッドで作業します。デフォルトの実装はsetup()を呼び出してから、処理するレコードの数をmap()倍し、最後にcleanup()メソッドを1回呼び出します。

これが誰かを助けることを願っています!