2009-06-24 7 views
2

ここでは、別のJVM、おそらく異なるマシンで実行されている複数のJavaプロセスに作業を分散する必要がある状況があります。JAVAでのワークロードの配布/並列実行

私は1から1000のレコードを持つテーブルを持っています。私は収集され、配布される作業を探しています.10セットです。その後、11〜20をworkerThreeに記録します。そういうことなど。言うまでもなく、workerOneはworkerTwoがそれを行うことができない限り、workerTwoの作業を行いません。

この例は、純粋にデータベースに基づいていますが、どのシステムにも拡張できます。ファイル処理、電子メール処理などと考えられます。

私は、即時の対応がマスター/ワーカーのアプローチに向かうと感じるという小さな感情を持っています。しかしここでは、異なるJVMについて話しています。たとえ1つのJVMがダウンしても、他のJVMはその作業を続けなければなりません。

今、百万ドルの質問があります:これを行うための設備を提供する良いフレームワーク(生産準備完了)がありますか?データベースレコード、ファイル処理、電子メール処理などのような具体的なニーズの具体的な実装があっても。

私はJava Parallel Execution Frameworkを見ましたが、それが別のJVMに使用できるかどうかは分かりません。また、別のJVMが使用されているかどうかはわかりません。従業員は複数のJVM上にある可能性があります。マスター?

詳細情報1:HadoopはJDK 1.6要件のために問題になります。それはあまりにもビットです。

おかげで、 フランクリン

答えて

1

メッセージキューを使用することもできます。 1つのプロセスで作業リストを生成し、素敵な小さなまとまりでパッケージ化してください。その後、それらのチャンクをキューに入れます。労働者のそれぞれは、待ち行列に何かが現れるのを待っているだけです。そうすると、作業員はチャンクを取り出して処理します。あるプロセスが停止した場合、他のプロセスが緩みを拾います。シンプルで人々は長い間そのようにしてきたので、ネット上には多くの情報があります。

+0

+1 JMSソリューション – akarnokd

0

あなたは、単一のデータベース内のレコードで作業する場合、使用して、データベース自体の内部で作業を行う考えますストアドプロシージャ。異なるマシン上のレコードを処理するための利得は、データベースとコンピューティングノードとの間でワークを取り出して送信するコストによって無効になる可能性があります。

ファイル処理に関しては、同様の場合があります。 (共有)ファイルシステムのファイルを操作すると、OSのI/O負荷が大きくなる可能性があります。

複数のマシンに複数のJVMを保守するためのコストは、あまりにも過剰になる可能性があります。

質問:私は一部の分散シミュレーションにJADE(Javaエージェント開発環境)を一度使用しました。そのマルチマシンのサポートとメッセージの受け渡しの性質はあなたを助けるかもしれません。

1

私はテラコッタがこれを行うことができると信じています。 Webページを扱っている場合は、JBossをクラスタ化できます。

これを自分で実行したい場合は、実行するジョブ、実行中のジョブ、完了していないジョブを再スケジュールする必要がある作業マネージャが必要です。その後、労働者は何かすることを求め、それを行い、その結果を送り返し、より多くのことを求めます。

どのような作業をしたいのかを詳しく説明したい場合があります。

1

あなたが記述した問題は、間違いなくマスタ/ワーカーパターンを使用して最もよく解決されます。

JavaSpaces(Jiniフレームワークの一部)を調べる必要があります。これは実際にこの種のものに適しています。基本的には、Commandオブジェクト内で実行される各タスクをカプセル化し、必要に応じてサブクラス化するだけです。これらをJavaSpaceにダンプし、ワーカーが一度に1つずつ取得して処理し、完了したら再構成します。

もちろん、パフォーマンスの向上はレコードの各セットを処理するのにかかる時間に依存しますが、複数のマシンに分散しても問題は発生しません。

+0

JavaSpacesの実装は成熟していないようです(私はopensourceを意味します)。何か知っていることを私に教えてください。どうもありがとう。しかしJavaSpacesは揺るがすようです。私は彼らがかなり成熟したことを望む。少なくともApache River !! – Franklin

+0

JavaSpaces自体はまだありますが(Jiniの一部として - http://www.jini.org/wiki/Category:Getting_Started)、まだ利用できるはずです。 GigaSpacesは間違いなく完成した製品で、無料のバージョンが用意されています。しかし、私はそれについての経験はなかった。 オープンソースが必要な場合は、Blitz(http://www.dancres.org/blitz/)をご覧ください。 – akatkinson

+0

SemiSpaceもOSSですhttp://www.semispace.org/semispace/ –

0

私はそれにJgroupsを使うことを考えます。 jvmsをクラスタ化することができ、ノードの1つをマスターとして選択し、ネットワーク経由でメッセージを送信することによって他のノードに作業を配布することができます。または、すでに作業項目をパーティション化してから、マスターノードでpartion-1などのパーティションの配布をJVM-4に、partion-2をJVM-3に、partion-3をJVM-2に、というように。 JVM-4が停止すると、マスターノードによって実現され、マスターノードは他のノードの1つに、パーティション1のピックアップを開始するよう指示します。 使いやすいもう1つの方法は、redis pubサブサポートです。 http://redis.io/topics/pubsub。しかし、あなたは私が好きではない赤字サーバーを維持する必要があります。

関連する問題