I am studying the FairScheduler source cod of yarn 2.7.3.By the code of class 
FSAppAttempt:

​
  public boolean hasContainerForNode(Priority prio, FSSchedulerNode node) {
​
    ResourceRequest anyRequest = getResourceRequest(prio, ResourceRequest.ANY); 
 
    ResourceRequest rackRequest = getResourceRequest(prio, node.getRackName()); 
    ResourceRequest nodeRequest = getResourceRequest(prio, node.getNodeName()); 
    
    return
        // There must be outstanding requests at the given priority:
        anyRequest != null && anyRequest.getNumContainers() > 0 &&
            // If locality relaxation is turned off at *-level, there must be a
            // non-zero request for the node's rack:
            (anyRequest.getRelaxLocality() ||
                (rackRequest != null && rackRequest.getNumContainers() > 0)) &&
            // If locality relaxation is turned off at rack-level, there must 
be a
            // non-zero request at the node:
            (rackRequest == null || rackRequest.getRelaxLocality() ||
                (nodeRequest != null && nodeRequest.getNumContainers() > 0)) &&
            // The requested container must be able to fit on the node:
            Resources.lessThanOrEqual(RESOURCE_CALCULATOR, null,
                anyRequest.getCapability(), 
node.getRMNode().getTotalCapability());
}
​
​
I really cannot understand why when there is no anyRequest , namely whose 
locality is off-swith , hasContainerForNode() will return false directly 
,without considering whether there is NODE_LOCAL  or  RACK_LOCAL requests.And , 
 AppSchedulingInfo.allocateNodeLocal() and 
AppSchedulingInfo.allocateRackLocal() will also decrease the number of 
containers for ResourceRequest.ANY, this is another place where I feel confused.

Really thanks for some prompt.

Reply via email to