通信する必要のない N 個のタスクを実行する必要があるクラスター/グリッドでアプリケーションを実行しています。各タスクの結果を収集するだけで済みます。そのため、マスターがいくつかのスレーブ (おそらく異なるホストで実行されている) にタスクを分散し、最後にすべての結果を結合します。
クラスターはバッチ システムによって制御されているため、実行ごとにノードの構成が変更され、ジョブ用に割り当てられたノードのリストが表示されます。
これに役立つライブラリ(純粋なJava)を探しています。私は以下を見ました:
MPJ - 同じマシンで複数のプロセッサを使用できる場合に MPJ が実行される方法が原因で、私には機能しません。カスタムクラスローダーを使用しているため、ロードしているネイティブライブラリで問題が発生します(カスタムクラスローダーがクラスを複数回ロードするため、複数回ロードされます)。
Hazelcast - 原理的には機能しますが、実際にはこのために作成されたわけではありません (ジョブをキューに分散し、結果を別のキューに戻すことはできますが、少しやり過ぎのように思えます)。私が気に入っているのは、ノードのグループを簡単にセットアップできることです (原則として、指定する必要があるのは 1 つだけで、他のノードはそれに接続するだけです)。
Simon/RMI - 各スレーブをマスターに登録させてから、マスターがジョブを各スレーブに分散させることができると思います。または、ジョブがキューに入れられるキューと、マスターからの結果が格納されるキューを各スレーブに要求させます。
Cajo - 原則として機能しますが、グリッド ネットワークでマルチキャストを使用したくありません。Cajo ではこれを回避する方法はないようです。
RabbitMQ - 追加のサーバーを実行するのは好きではなく、純粋な Java ではありません。ZeroMQについても同じです。
Akka - あまりにもやり過ぎのようです。そして、ノードのグループをセットアップするための多くの構成。
Hadoop - Akka のように、特にノードのグループをセットアップするための構成がやり過ぎのようです。
JPPF - サーバーとノードの長期実行クラスターのセットアップにより適しているようです。アプリケーションが終了したら、すべてのサーバーとノードを停止する必要があります。また、私にとってはオプションではないタスクのシリアル化に依存しているようです(以下を参照)
だから私はヘーゼルキャストかサイモンのどちらかを使い続けるだろう. この種のアプリケーションに適しているのはどれですか? 誰かが別のライブラリを知っていますか (重すぎず、構成が多すぎません)。他の提案はありますか?
Hazelcasts ExecutorService はオプションではありません。私はいくつかのJNIを使用しているため、シリアル化は面倒です。