1

通信する必要のない N 個のタスクを実行する必要があるクラスター/グリッドでアプリケーションを実行しています。各タスクの結果を収集するだけで済みます。そのため、マスターがいくつかのスレーブ (おそらく異なるホストで実行されている) にタスクを分散し、最後にすべての結果を結合します。

クラスターはバッチ システムによって制御されているため、実行ごとにノードの構成が変更され、ジョブ用に割り当てられたノードのリストが表示されます。

これに役立つライブラリ(純粋なJava)を探しています。私は以下を見ました:

MPJ - 同じマシンで複数のプロセッサを使用できる場合に MPJ が実行される方法が原因で、私には機能しません。カスタムクラスローダーを使用しているため、ロードしているネイティブライブラリで問題が発生します(カスタムクラスローダーがクラスを複数回ロードするため、複数回ロードされます)。

Hazelcast - 原理的には機能しますが、実際にはこのために作成されたわけではありません (ジョブをキューに分散し、結果を別のキューに戻すことはできますが、少しやり過ぎのように思えます)。私が気に入っているのは、ノードのグループを簡単にセットアップできることです (原則として、指定する必要があるのは 1 つだけで、他のノードはそれに接続するだけです)。

Simon/RMI - 各スレーブをマスターに登録させてから、マスターがジョブを各スレーブに分散させることができると思います。または、ジョブがキューに入れられるキューと、マスターからの結果が格納されるキューを各スレーブに要求させます。

Cajo - 原則として機能しますが、グリッド ネットワークでマルチキャストを使用したくありません。Cajo ではこれを回避する方法はないようです。

RabbitMQ - 追加のサーバーを実行するのは好きではなく、純粋な Java ではありません。ZeroMQについても同じです。

Akka - あまりにもやり過ぎのようです。そして、ノードのグループをセットアップするための多くの構成。

Hadoop - Akka のように、特にノードのグループをセットアップするための構成がやり過ぎのようです。

JPPF - サーバーとノードの長期実行クラスターのセットアップにより適しているようです。アプリケーションが終了したら、すべてのサーバーとノードを停止する必要があります。また、私にとってはオプションではないタスクのシリアル化に依存しているようです(以下を参照)

だから私はヘーゼルキャストかサイモンのどちらかを使い続けるだろう. この種のアプリケーションに適しているのはどれですか? 誰かが別のライブラリを知っていますか (重すぎず、構成が多すぎません)。他の提案はありますか?

Hazelcasts ExecutorService はオプションではありません。私はいくつかのJNIを使​​用しているため、シリアル化は面倒です。

4

2 に答える 2

0

最終的にMPJに落ち着きました。カスタム クラス ローダーの問題は、MPJ に含まれるスクリプトを使用せずに、次のパラメーターを使用して Java プログラムを直接呼び出すことで簡単に回避できます。

java class rank mpj-config niodev [アプリケーションの追加引数]

rank、mpj-config、および niodev 引数は、MPI_Init 呼び出しによって削除されます。mpj-config は、ランク数、メッセージ プロトコルのスイッチングしきい値、および対応するポート番号とランクを含むホストのリストをリストするファイルです。niodev は、通信メカニズムを指定します (詳細については、MPJ-Express のドキュメントを参照してください)。構成ファイルは次のようになります。

3
131072
a6444@20000@0
a6444@20002@1
a6413@20000@2

MPJ は指定されたポート + 次のポート (たとえば 20000 と 20001) を使用するため、同じホストのポート番号を 2 で区切ることが重要です。

Simon と Hazelcast も優れたソリューションでしたが、MPJ よりも少し遅くなりました。特に、両方の初期化はかなり遅くなります。

于 2013-08-12T14:36:14.530 に答える
0

この解決策がうまくいかない場合はお知らせください。Hazelcast は、Executor Service によるマルチノード タスクの実行を提供します。

したがって、タスクを実行するノードのリストを取得します。

その後

HazelcastInstance h = Hazelcast.newHazelcastInstance();
Set<Member> members = h.getCluster().getMembers();//or any subset given your requirement 
MultiTask<Long> multitask = new MultiTask<Long>(new MyCallableTask("default"), members);
ExecutorService es = h1.getExecutorService();
es.execute(multitask);
Collection<Long> results = multitask.get();

必要な作業はMyCallableTask、すべてのノードのクラスパスに のクラスを含めることだけです。

于 2013-08-13T17:57:47.867 に答える