GridGain 根据 CPU 投影可用节点数分配任务
GridGain distribute Tasks according to CPU Numbers of Nodes available in Projection
我编写了一个非常简单的 Java 应用程序来执行一些 md5 哈希计算。
我正在尝试将此计算分发到实验室内的多个节点以加快速度。
这确实有效,但它的分布方式给我带来了麻烦。
网格中的节点有 8 个 cpu 和只有一个的节点。
我想为每个 cpu 每个节点分配一个作业(线程、可调用、任务)。但是我得到一个非常糟糕的分布:有时在一个 cpu 的节点上有 4 个工作 运行,而一个有 8 个 cpu 的节点只得到 2 或 3 个任务。
我在 GridGain API(forPredicate in GridGain API):
中找到了 forPredicate(GridPredicate p) 函数
Creates a grid projection which includes all nodes that pass the given predicate filter.
但是,我用错了,或者我理解错了它的功能。这是我得到的一个最小示例:
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(){[...]}
}
预期的行为是它会检查每个节点有多少 cpu 并在向其发送作业之前检查作业计数(活动和等待)是否大于此数字。
但是,事实并非如此。我仍然得到 "bad distribution"。
谁能告诉我如何根据每个节点的可用 cpu 数量进行分配?
感谢您的帮助和时间!
对相对较短的 运行 任务使用指标通常效果不佳,因为指标更新频率太低。
我看到有两个开箱即用的解决方案:
- 配置
GridWeightedRandomLoadBalancingSpi
节点权重等于可用处理器的数量,并在不选择子投影的情况下在网格上执行您的任务,让 GridGain 对任务进行负载平衡。然后节点将获得与可用处理器数量成比例的负载。
- 配置
GridJobStealingCollisionSpi
。在这种情况下,负载不足的节点将 'steal' 来自超载节点的作业,作业在队列中等待。当事先不知道作业计算成本时,这种方法特别有效。
有关详细信息,请参阅 SPI javadoc 和文档:
http://doc.gridgain.org/latest/Job+Collision+Resolution
http://doc.gridgain.org/latest/Load+Balancing
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>
我编写了一个非常简单的 Java 应用程序来执行一些 md5 哈希计算。 我正在尝试将此计算分发到实验室内的多个节点以加快速度。 这确实有效,但它的分布方式给我带来了麻烦。 网格中的节点有 8 个 cpu 和只有一个的节点。 我想为每个 cpu 每个节点分配一个作业(线程、可调用、任务)。但是我得到一个非常糟糕的分布:有时在一个 cpu 的节点上有 4 个工作 运行,而一个有 8 个 cpu 的节点只得到 2 或 3 个任务。 我在 GridGain API(forPredicate in GridGain API):
中找到了 forPredicate(GridPredicate p) 函数Creates a grid projection which includes all nodes that pass the given predicate filter.
但是,我用错了,或者我理解错了它的功能。这是我得到的一个最小示例:
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(){[...]}
}
预期的行为是它会检查每个节点有多少 cpu 并在向其发送作业之前检查作业计数(活动和等待)是否大于此数字。 但是,事实并非如此。我仍然得到 "bad distribution"。 谁能告诉我如何根据每个节点的可用 cpu 数量进行分配? 感谢您的帮助和时间!
对相对较短的 运行 任务使用指标通常效果不佳,因为指标更新频率太低。
我看到有两个开箱即用的解决方案:
- 配置
GridWeightedRandomLoadBalancingSpi
节点权重等于可用处理器的数量,并在不选择子投影的情况下在网格上执行您的任务,让 GridGain 对任务进行负载平衡。然后节点将获得与可用处理器数量成比例的负载。 - 配置
GridJobStealingCollisionSpi
。在这种情况下,负载不足的节点将 'steal' 来自超载节点的作业,作业在队列中等待。当事先不知道作业计算成本时,这种方法特别有效。
有关详细信息,请参阅 SPI javadoc 和文档: http://doc.gridgain.org/latest/Job+Collision+Resolution http://doc.gridgain.org/latest/Load+Balancing
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>