Java GridGain根据投影中可用节点的CPU数量分配任务

Java GridGain根据投影中可用节点的CPU数量分配任务,java,distributed-computing,gridgain,Java,Distributed Computing,Gridgain,我编写了一个非常简单的Java应用程序,可以进行一些md5哈希计算。 我正试图将这些计算分布到实验室内的几个节点,以加快速度。 这确实有效,但它的分布方式给我带来了麻烦。 网格中有8个CPU的节点和只有一个CPU的节点。 我想为每个节点的每个cpu分配一个作业(线程、可调用、任务)。但我得到了一个非常糟糕的分布:有时4个作业在一个有一个cpu的节点上运行,而一个有8个cpu的节点只能执行2到3个任务。 我在GridGain API()中找到了forPredicate(GridPredicate

我编写了一个非常简单的Java应用程序,可以进行一些md5哈希计算。 我正试图将这些计算分布到实验室内的几个节点,以加快速度。 这确实有效,但它的分布方式给我带来了麻烦。 网格中有8个CPU的节点和只有一个CPU的节点。 我想为每个节点的每个cpu分配一个作业(线程、可调用、任务)。但我得到了一个非常糟糕的分布:有时4个作业在一个有一个cpu的节点上运行,而一个有8个cpu的节点只能执行2到3个任务。 我在GridGain API()中找到了forPredicate(GridPredicate p)函数:

创建包含通过给定谓词过滤器的所有节点的栅格投影

然而,我用错了,或者我把它的功能搞错了。下面是我得到的一个最简单的例子:

       public class Driver implements GridCallable<Integer>{
        [...]                    
        Grid g = GridGain.start(gConf);    
        ArrayList<GridFuture<Integer>> workers = new ArrayList<GridFuture<Integer>>();
        for(int i=0; i<workercount; i++){
            Driver worker = new Driver();
            //Here some values get added to the driver object, irrelevant
            workers.add(g.forPredicate(new GridPredicate<GridNode>() {
                    @Override
                    public boolean apply(GridNode node) {
                        int cores = node.metrics().getTotalCpus();
                        return ((node.metrics().getCurrentWaitingJobs()+node.metrics().getCurrentActiveJobs()) < cores);
                    }
            }).compute().call(worker));
        }
        [...]
        public Integer call(){[...]}
        }
公共类驱动程序实现GridCallable{
[...]                    
网格g=网格增益启动(gConf);
ArrayList workers=新建ArrayList();

对于(int i=0;i而言,对运行时间相对较短的任务使用指标通常效果不佳,因为指标更新频率太小

我看到两种现成的解决方案:

  • 配置
    GridWeightedRandomLoadBalancingSpi
    ,使节点权重等于可用处理器的数量,并在网格上执行任务而不选择子项目,让GridGain对任务进行负载平衡。然后节点将获得与可用处理器数量成比例的负载
  • 配置
    GridJobStealingCollisionSpi
    。在这种情况下,未加载的节点将从过载的节点中“窃取”作业,作业在队列中等待。当作业计算成本事先未知时,这种方法尤其有效
有关更多信息,请参阅SPIs javadoc和文档:

UPD:以下是如何配置加权负载平衡SPI以使用可用处理器的数量:

<property name="loadBalancingSpi">
    <bean class="org.gridgain.grid.spi.loadbalancing.weightedrandom.GridWeightedRandomLoadBalancingSpi">
        <property name="useWeights" value="true"/>
        <property name="nodeWeight" value="#{T(java.lang.Runtime).getRuntime().availableProcessors()}"/>
    </bean>
</property>