最初我启动了三个网格节点,我的java程序中有200多个作业。我已将所有作业共享到网格节点。一旦我运行应用程序,将通过eclipse引入另一个节点,它也参与作业的执行。这意味着一个节点并行执行50个作业。 当所有节点都在执行他们的工作时,我已经启动了另一个节点,并且计划将这些工作共享给处于不完整状态的节点。
我们怎么能这样做......
答案 0 :(得分:1)
要迁移处于执行中期的作业,您需要让作业监听拓扑事件并通过停止某些作业(在拆分中)并使用checkpoint&组合来迁移它们。自定义故障转移SPI。
这不仅仅是几行代码而是相当先进的用例。我会考虑缩短工作时间和/或减少“大小”,以更好地利用不断变化的拓扑结构。
答案 1 :(得分:0)
我对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的文档。
(编辑:当然你必须在每个节点上使用相同的设置)