@IgniteSpiMultipleInstancesSupport(value=true) public class RoundRobinLoadBalancingSpi extends IgniteSpiAdapter implements LoadBalancingSpi, RoundRobinLoadBalancingSpiMBean
setPerTask(boolean) configuration).
When configured in per-task mode, implementation will pick a random starting node at the beginning of every task execution and then sequentially iterate through all nodes in topology starting from the picked node. This is the default configuration and should fit most of the use cases as it provides a fairly well-distributed split and also ensures that jobs within a single task are spread out across nodes to the maximum. For cases when split size is equal to the number of nodes, this mode guarantees that all nodes will participate in the split.
When configured in global mode, a single sequential queue of nodes is maintained for
all tasks and the next node in the queue is picked every time. In this mode (unlike in
per-task mode) it is possible that even if split size may be equal to the
number of nodes, some jobs within the same task will be assigned to the same node if
multiple tasks are executing concurrently.
ComputeTaskSplitAdapter then load balancing logic
is transparent to your code and is handled automatically by the adapter.
Here is an example of how your task will look:
public class MyFooBarTask extends GridComputeTaskSplitAdapter<Object, Object> {
@Override
protected Collection<? extends ComputeJob> split(int gridSize, Object arg) throws IgniteCheckedException {
List<MyFooBarJob> jobs = new ArrayList<MyFooBarJob>(gridSize);
for (int i = 0; i < gridSize; i++) {
jobs.add(new MyFooBarJob(arg));
}
// Node assignment via load balancer
// happens automatically.
return jobs;
}
...
}
If you need more fine-grained control over how some jobs within task get mapped to a node
and use affinity load balancing for some other jobs within task, then you should use
ComputeTaskAdapter. Here is an example of how your task will look. Note that in this
case we manually inject load balancer and use it to pick the best node. Doing it in
such way would allow user to map some jobs manually and for others use load balancer.
public class MyFooBarTask extends ComputeTaskAdapter<String, String> {
// Inject load balancer.
@LoadBalancerResource
ComputeLoadBalancer balancer;
// Map jobs to grid nodes.
public Map<? extends ComputeJob, GridNode> map(List<GridNode> subgrid, String arg) throws IgniteCheckedException {
Map<MyFooBarJob, GridNode> jobs = new HashMap<MyFooBarJob, GridNode>(subgrid.size());
// In more complex cases, you can actually do
// more complicated assignments of jobs to nodes.
for (int i = 0; i < subgrid.size(); i++) {
// Pick the next best balanced node for the job.
jobs.put(new MyFooBarJob(arg), balancer.getBalancedNode())
}
return jobs;
}
// Aggregate results into one compound result.
public String reduce(List<ComputeJobResult> results) throws IgniteCheckedException {
// For the purpose of this example we simply
// concatenate string representation of every
// job result
StringBuilder buf = new StringBuilder();
for (ComputeJobResult res : results) {
// Append string representation of result
// returned by every job.
buf.append(res.getData().string());
}
return buf.string();
}
}
RoundRobinLoadBalancingSpi either from Spring XML file or
directly. The following configuration parameters are supported:
per-task or global
round-robin modes described above (see setPerTask(boolean)).
RoundRobinLoadBalancingSpi spi = new RoundRobinLoadBalancingSpi(); // Configure SPI to use global round-robin mode. spi.setPerTask(false); IgniteConfiguration cfg = new IgniteConfiguration(); // Override default load balancing SPI. cfg.setLoadBalancingSpi(spi); // Starts grid. G.start(cfg);Here is how you can configure
RoundRobinLoadBalancingSpi using Spring XML configuration:
<property name="loadBalancingSpi">
<bean class="org.apache.ignite.spi.loadBalancing.roundrobin.RoundRobinLoadBalancingSpi">
<!-- Set to global round-robin mode. -->
<property name="perTask" value="false"/>
</bean>
</property>
For information about Spring framework visit www.springframework.org
gridName, ignite| Constructor and Description |
|---|
RoundRobinLoadBalancingSpi() |
| Modifier and Type | Method and Description |
|---|---|
ClusterNode |
getBalancedNode(ComputeTaskSession ses,
List<ClusterNode> top,
ComputeJob job)
Gets balanced node for specified job within given task session.
|
boolean |
isPerTask()
Configuration parameter indicating whether a new round robin order should be
created for every task.
|
protected void |
onContextDestroyed0()
Method to be called in the beginning of onContextDestroyed() method.
|
protected void |
onContextInitialized0(IgniteSpiContext spiCtx)
Method to be called in the end of onContextInitialized method.
|
void |
setPerTask(boolean isPerTask)
Configuration parameter indicating whether a new round robin order should be
created for every task.
|
void |
spiStart(String gridName)
This method is called to start SPI.
|
void |
spiStop()
This method is called to stop SPI.
|
String |
toString() |
addTimeoutObject, assertParameter, checkConfigurationConsistency0, configInfo, createSpiAttributeName, failureDetectionTimeout, failureDetectionTimeoutEnabled, failureDetectionTimeoutEnabled, getConsistentAttributeNames, getExceptionRegistry, getIgniteHome, getLocalNode, getLocalNodeId, getName, getNodeAttributes, getSpiContext, getStartTimestamp, getStartTimestampFormatted, getUpTime, getUpTimeFormatted, initFailureDetectionTimeout, injectables, injectResources, isNodeStopping, onClientDisconnected, onClientReconnected, onContextDestroyed, onContextInitialized, registerMBean, removeTimeoutObject, setName, startInfo, startStopwatch, stopInfo, unregisterMBeanclone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitgetName, getNodeAttributes, onClientDisconnected, onClientReconnected, onContextDestroyed, onContextInitializedgetIgniteHome, getLocalNodeId, getName, getStartTimestamp, getStartTimestampFormatted, getUpTime, getUpTimeFormattedpublic boolean isPerTask()
true then load balancer is guaranteed
to iterate through nodes sequentially for every task - so as long as number
of jobs is less than or equal to the number of nodes, jobs are guaranteed to
be assigned to unique nodes. If false then one round-robin order
will be maintained for all tasks, so when tasks execute concurrently, it
is possible for more than one job within task to be assigned to the same
node.
Default is true.
isPerTask in interface RoundRobinLoadBalancingSpiMBeantrue.@IgniteSpiConfiguration(optional=true) public void setPerTask(boolean isPerTask)
true then load balancer is guaranteed
to iterate through nodes sequentially for every task - so as long as number
of jobs is less than or equal to the number of nodes, jobs are guaranteed to
be assigned to unique nodes. If false then one round-robin order
will be maintained for all tasks, so when tasks execute concurrently, it
is possible for more than one job within task to be assigned to the same
node.
Default is false.
isPerTask - Configuration parameter indicating whether a new round robin order should
be created for every task. Default is false.public void spiStart(@Nullable
String gridName)
throws IgniteSpiException
spiStart in interface IgniteSpigridName - Name of grid instance this SPI is being started for
(null for default grid).IgniteSpiException - Throws in case of any error during SPI start.public void spiStop()
throws IgniteSpiException
Note that this method can be called at any point including during recovery of failed start. It should make no assumptions on what state SPI will be in when this method is called.
spiStop in interface IgniteSpiIgniteSpiException - Thrown in case of any error during SPI stop.protected void onContextInitialized0(IgniteSpiContext spiCtx) throws IgniteSpiException
onContextInitialized0 in class IgniteSpiAdapterspiCtx - SPI context.IgniteSpiException - In case of errors.protected void onContextDestroyed0()
onContextDestroyed0 in class IgniteSpiAdapterpublic ClusterNode getBalancedNode(ComputeTaskSession ses, List<ClusterNode> top, ComputeJob job)
getBalancedNode in interface LoadBalancingSpises - Grid task session for currently executing task.top - Topology of task nodes from which to pick the best balanced node for given job.job - Job for which to pick the best balanced node.
Follow @ApacheIgnite
Ignite Fabric : ver. 1.5.11 Release Date : April 8 2016