提问者:小点点

每个节点仅在 Apache Ignite 中执行一个任务


我对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.");
            }
        });
    }

共1个答案

匿名用户

是的,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

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