在ApacheIgnite中,每个节点只能执行一个任务

在ApacheIgnite中,每个节点只能执行一个任务,ignite,Ignite,我对ApacheIgnite比较陌生。我使用Ignite compute将任务分发到节点。我的目标是一个任务调度器,它生成任务并只将这些任务提交给“空闲”节点。一个节点一次只能执行一项任务。如果所有节点都有一个正在运行的任务,调度员应等待下一个节点可用,然后提交下一个任务 我可以用队列和异步可调用函数来实现这一点,但是我想知道是否有这样一个Ignite板载类?我不确定ComputeTaskSplitAdapter类是我需要看的,我不完全理解它的用途 谢谢你的帮助 在分发任务时,服务器节点可以加入

我对ApacheIgnite比较陌生。我使用Ignite compute将任务分发到节点。我的目标是一个任务调度器,它生成任务并只将这些任务提交给“空闲”节点。一个节点一次只能执行一项任务。如果所有节点都有一个正在运行的任务,调度员应等待下一个节点可用,然后提交下一个任务

我可以用队列和异步可调用函数来实现这一点,但是我想知道是否有这样一个Ignite板载类?我不确定ComputeTaskSplitAdapter类是我需要看的,我不完全理解它的用途

谢谢你的帮助

在分发任务时,服务器节点可以加入和离开集群。 任务可能在节点上花费不同的时间,一旦服务器完成任务,它将获得下一个任务

这是我的节点代码:

    JobStealingCollisionSpi spi = new JobStealingCollisionSpi();
    spi.setActiveJobsThreshold(1);

    IgniteConfiguration cfg = new IgniteConfiguration();
    cfg.setCollisionSpi(spi);

    Ignition.start(cfg);
这是我的工作分配代码(用于测试):

jobsealingcollisionspi=newjobsealingcollisionspi();
spi.setActiveJobsThreshold(1);
IgniteConfiguration cfg=新IgniteConfiguration();
设置碰撞spi(spi);
点火。设置客户端模式(真);
点火=点火启动(cfg);
对于(int i=0;i<10;i++)
{
ignite.compute().runAsync(新IgniteRunnable())
{
@凌驾
公开募捐
{
系统输出打印(“睡眠…”);
尝试
{
睡眠(10000);
}捕捉(中断异常e)
{
e、 printStackTrace();
}
System.out.println(“完成”);
}
});
}
是的,有直接的支持。请查看作业计划文档中的部分:

请注意,每个服务器都有自己的等待队列,服务器在完成前一个作业后,将立即移动到队列中的下一个作业

如果您想要更积极的日程安排,那么您可以在此处查看日程安排:


启用作业窃取后,一旦服务器自己的队列变为空,服务器仍将从其他服务器上的作业队列中删除作业。大多数参数都是可配置的。

不确定这是否解决了我的特定问题,因为任务可能需要不同的时间,服务器节点也可能需要不同的时间,并且在运行时加入并停止。我希望服务器可以在完成当前任务后立即执行新任务,而不是等待FIFO排序。我认为FifoqueCollisionSPI和PriorityQueueCollisionSpi都不能解决这个问题,对吗?我已经更新了响应。我认为工作偷盗是你可能正在寻找的东西。很抱歉,我不完全理解使用工作偷盗SPI如何解决我的问题。请注意,配置SPI时,可用服务器的数量未知,服务器可以在运行时加入/离开。所以在我看来,在启动时必须配置并行作业的数量,我认为需要与服务器的数量相等。还是我误解了?这个SPI用例有例子吗?并行作业是每个节点,而不是每个集群。您可以将每个服务器上的并行作业数设置为1,这样每个服务器上的作业将一次执行一个。其他作业将被累积,而释放出来的其他服务器可能会窃取这些作业。我想这正是你想要的行为,不是吗?我在上面的问题中添加了我的代码。我希望IgniteRunnable在每个节点上只执行一个节点。但是这些节点实际上失败了,java.lang.InterruptedException:sleep interrupted告诉我它们是并行执行的。我的假设错了吗?也许我完全误解了什么?
    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.");
            }
        });
    }