Apache Ignite 中每个节点只有一个任务
One task per node only in Apache Ignite
我对 Apache Ignite 比较陌生。我正在使用 Ignite compute 将任务分配给节点。我的目标是一个任务调度程序,它可以生成任务并将这些任务仅提交给 "free" 的节点。一个节点一次只能执行一项任务。如果所有节点都有任务运行,调度器将等待下一个节点可用,然后提交下一个任务。
我可以使用队列和异步 Callable 来实现它,但是我想知道板载 class 是否有一个 Ignite 可以做这样的事情?不确定 class ComputeTaskSplitAdapter 是我需要查看的内容,我没有完全理解它的用途。
感谢任何帮助。
服务器节点可以在分配任务时加入和离开集群。
任务在节点上花费的时间可能不同,一旦服务器完成任务,它就会获得下一个任务。
这是我的节点代码:
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 has direct support for it. Please take a look at the One-at-a-Time section in the Job Scheduling documentation: https://apacheignite.readme.io/docs/job-scheduling#section-one-at-a-time
请注意,每个服务器都有自己的等待队列,并且服务器在完成上一个作业后会立即移至队列中的下一个作业。
如果你想要更积极的安排,那么你可以看看Job-Stealing scheduling here: https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/spi/collision/jobstealing/JobStealingCollisionSpi.html
启用作业窃取后,一旦服务器自己的队列变空,服务器仍会从其他服务器的作业队列中获取作业。大多数参数都是可配置的。
我对 Apache Ignite 比较陌生。我正在使用 Ignite compute 将任务分配给节点。我的目标是一个任务调度程序,它可以生成任务并将这些任务仅提交给 "free" 的节点。一个节点一次只能执行一项任务。如果所有节点都有任务运行,调度器将等待下一个节点可用,然后提交下一个任务。
我可以使用队列和异步 Callable 来实现它,但是我想知道板载 class 是否有一个 Ignite 可以做这样的事情?不确定 class ComputeTaskSplitAdapter 是我需要查看的内容,我没有完全理解它的用途。
感谢任何帮助。
服务器节点可以在分配任务时加入和离开集群。 任务在节点上花费的时间可能不同,一旦服务器完成任务,它就会获得下一个任务。
这是我的节点代码:
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 has direct support for it. Please take a look at the One-at-a-Time section in the Job Scheduling documentation: https://apacheignite.readme.io/docs/job-scheduling#section-one-at-a-time
请注意,每个服务器都有自己的等待队列,并且服务器在完成上一个作业后会立即移至队列中的下一个作业。
如果你想要更积极的安排,那么你可以看看Job-Stealing scheduling here: https://ignite.apache.org/releases/latest/javadoc/org/apache/ignite/spi/collision/jobstealing/JobStealingCollisionSpi.html
启用作业窃取后,一旦服务器自己的队列变空,服务器仍会从其他服务器的作业队列中获取作业。大多数参数都是可配置的。