in myriad-scheduler/src/main/java/org/apache/myriad/policy/LeastAMNodesFirstPolicy.java [72:116]
public void apply(List<Protos.TaskID> taskIDs) {
if (LOGGER.isDebugEnabled()) {
for (SchedulerNode node : schedulerNodes.values()) {
LOGGER.debug("Host {} is running {} containers including {} App Masters", node.getNodeID().getHost(),
node.getRunningContainers().size(), getNumAMContainers(node.getRunningContainers()));
}
}
// We need to lock the YARN scheduler here. If we don't do that, then the YARN scheduler can
// process HBs from NodeManagers and the state of SchedulerNode objects might change while we
// are in the middle of sorting them based on the least number of AM containers.
synchronized (yarnScheduler) {
Collections.sort(taskIDs, new Comparator<Protos.TaskID>() {
@Override
public int compare(Protos.TaskID t1, Protos.TaskID t2) {
SchedulerNode o1 = schedulerNodes.get(schedulerState.getTask(t1).getHostname());
SchedulerNode o2 = schedulerNodes.get(schedulerState.getTask(t2).getHostname());
if (o1 == null) { // a NM was launched by Myriad, but it hasn't yet registered with RM
if (o2 == null) {
return 0;
} else {
return -1;
}
} else if (o2 == null) {
return 1;
} // else, both the NMs have registered with RM
List<RMContainer> runningContainers1 = o1.getRunningContainers();
List<RMContainer> runningContainers2 = o2.getRunningContainers();
Integer numRunningAMs1 = getNumAMContainers(runningContainers1);
Integer numRunningAMs2 = getNumAMContainers(runningContainers2);
Integer numRunningContainers1 = runningContainers1.size();
Integer numRunningContainers2 = runningContainers2.size();
// If two NMs are running equal number of AMs, sort them based on total num of running containers
if (numRunningAMs1.compareTo(numRunningAMs2) == 0) {
return numRunningContainers1.compareTo(numRunningContainers2);
}
return numRunningAMs1.compareTo(numRunningAMs2);
}
});
}
}