我对Apache Ignite相对较新。我正在使用 Ignite 计算将任务分发到节点。我的目标是一个任务调度程序,它生成任务并仅将这些任务提交到“免费”节点。一个节点一次只能执行一项任务。如果所有节点都有任务正在运行,则调度程序应等待下一个节点可用,然后提交下一个任务。
我可以用队列和异步调用来实现这个,但是我想知道是否有一个Ignite板载类可以做这样的事情?不确定ComputeTaskSplit适配器类是我需要看的,我不完全理解它的目的。
感谢任何帮助。
服务器节点可以在分配任务时加入和离开群集。任务在节点上可能需要不同的时间,一旦服务器完成任务,它就会获得下一个任务。
这是我的节点代码:
JobStealingCollisionSpi spi = new JobStealingCollisionSpi();
spi.setActiveJobsThreshold(1);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setCollisionSpi(spi);
Ignition.start(cfg);
这是我的工作分配代码(用于测试):
JobStealingCollisionSpi spi = new JobStealingCollisionSpi();
spi.setActiveJobsThreshold(1);
IgniteConfiguration cfg = new IgniteConfiguration();
cfg.setCollisionSpi(spi);
Ignition.setClientMode(true);
Ignite ignite = Ignition.start(cfg);
for (int i = 0; i < 10; i++)
{
ignite.compute().runAsync(new IgniteRunnable()
{
@Override
public void run()
{
System.out.print("Sleeping...");
try
{
Thread.sleep(10000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Done.");
}
});
}
是的,Apache Ignite直接支持它。请查看Job Scheduling文档中的One-at-a-Time部分:https://apacheignite.readme.io/docs/job-scheduling#section-一次一个
请注意,每台服务器都有自己的等待队列,在完成上一个作业后,服务器将立即移动到队列中的下一个作业。
如果您想要更积极的调度,那么您可以在此处查看作业窃取调度:https://ignite . Apache . org/releases/latest/javadoc/org/Apache/ignite/SPI/collision/Job Stealing collision SPI . html
启用作业窃取后,一旦服务器自己的队列变空,服务器仍会从其他服务器上的作业队列中窃取作业。大多数参数都是可配置的。