public void apply()

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);
        }
      });
    }
  }