Gridgain での経験から、ジョブ定義は処理時間にとって非常に重要であることがわかりました。小さなサイズのジョブを生成すると、通信のオーバーヘッドが大きくなり、すべてが遅くなる可能性があります (結果収集のキャッシュ サイズやタイムアウトに関する他の問題が発生する可能性もあります)。一方、サイズが大きすぎるジョブを選択すると、他のノードがアイドル状態である間に低速ノードがプロセスをブロックする可能性があります。仕事に最適なサイズを見つけることは困難です。
ジョブ スティーリングは、ジョブがグリッド ノードに送信された後にジョブをより適切に分散するのに役立つ場合があります。現在処理されているジョブを特定の数に制限し、ワーカー ノードがキュー内のこの数を超えるジョブをすべて盗むことができるようにするには、次のコードを使用します。この構成は、xml ファイルでも可能です。
public class ConfigGrid {
// config jobStealing
public static GridConfigurationAdapter JobStealing(
GridConfigurationAdapter cfg,
int waitJobsThreshold,
int activeJobsThreshold,
boolean stealingEnabled)
{
GridJobStealingCollisionSpi spi = new GridJobStealingCollisionSpi();
// Configure number of waiting jobs
// in the queue for job stealing.
spi.setWaitJobsThreshold(waitJobsThreshold);
// Configure stealing attempts number.
spi.setMaximumStealingAttempts(10);
// Configure number of active jobs that are allowed to execute
// in parallel. This number should usually be equal to the number
// of threads in the pool (default is 100).
spi.setActiveJobsThreshold(activeJobsThreshold);
// Enable stealing.
spi.setStealingEnabled(stealingEnabled);
// Override default Collision SPI.
cfg.setCollisionSpi(spi);
return cfg;
}
メイン関数で、次のように呼び出します。
GridConfigurationAdapter cfg = new GridConfigurationAdapter();
// config job stealing
cfg = ConfigGrid.JobStealing(cfg, numberOfJobs, setActiveJobs, stealingEnabled);
GridFactory.start(cfg);
詳細な設定については、GridJobStealingCollisionSpi に関するドキュメントを参照してください。
(編集: もちろん、各ノードで同じ設定を使用する必要があります)