|
@@ -21,6 +21,7 @@ package org.apache.hadoop.yarn.server.federation.policies.router;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
import java.util.Collections;
|
|
import java.util.Collections;
|
|
|
|
|
|
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
|
|
@@ -78,7 +79,7 @@ public class LocalityRouterPolicy extends WeightedRandomRouterPolicy {
|
|
resolver = policyContext.getFederationSubclusterResolver();
|
|
resolver = policyContext.getFederationSubclusterResolver();
|
|
Map<SubClusterIdInfo, Float> weights =
|
|
Map<SubClusterIdInfo, Float> weights =
|
|
getPolicyInfo().getRouterPolicyWeights();
|
|
getPolicyInfo().getRouterPolicyWeights();
|
|
- enabledSCs = new ArrayList<SubClusterId>();
|
|
|
|
|
|
+ enabledSCs = new ArrayList<>();
|
|
for (Map.Entry<SubClusterIdInfo, Float> entry : weights.entrySet()) {
|
|
for (Map.Entry<SubClusterIdInfo, Float> entry : weights.entrySet()) {
|
|
if (entry != null && entry.getValue() > 0) {
|
|
if (entry != null && entry.getValue() > 0) {
|
|
enabledSCs.add(entry.getKey().toId());
|
|
enabledSCs.add(entry.getKey().toId());
|
|
@@ -100,8 +101,7 @@ public class LocalityRouterPolicy extends WeightedRandomRouterPolicy {
|
|
// Fast path for FailForward to WeightedRandomRouterPolicy
|
|
// Fast path for FailForward to WeightedRandomRouterPolicy
|
|
if (rrList == null || rrList.isEmpty() || (rrList.size() == 1
|
|
if (rrList == null || rrList.isEmpty() || (rrList.size() == 1
|
|
&& ResourceRequest.isAnyLocation(rrList.get(0).getResourceName()))) {
|
|
&& ResourceRequest.isAnyLocation(rrList.get(0).getResourceName()))) {
|
|
- return super
|
|
|
|
- .getHomeSubcluster(appSubmissionContext, blackListSubClusters);
|
|
|
|
|
|
+ return super.getHomeSubcluster(appSubmissionContext, blackListSubClusters);
|
|
}
|
|
}
|
|
|
|
|
|
if (rrList.size() != 3) {
|
|
if (rrList.size() != 3) {
|
|
@@ -109,12 +109,11 @@ public class LocalityRouterPolicy extends WeightedRandomRouterPolicy {
|
|
"Invalid number of resource requests: " + rrList.size());
|
|
"Invalid number of resource requests: " + rrList.size());
|
|
}
|
|
}
|
|
|
|
|
|
- Map<SubClusterId, SubClusterInfo> activeSubClusters =
|
|
|
|
- getActiveSubclusters();
|
|
|
|
- List<SubClusterId> validSubClusters =
|
|
|
|
- new ArrayList<>(activeSubClusters.keySet());
|
|
|
|
- FederationPolicyUtils
|
|
|
|
- .validateSubClusterAvailability(validSubClusters, blackListSubClusters);
|
|
|
|
|
|
+ Map<SubClusterId, SubClusterInfo> activeSubClusters = getActiveSubclusters();
|
|
|
|
+ Set<SubClusterId> validSubClusters = activeSubClusters.keySet();
|
|
|
|
+ FederationPolicyUtils.validateSubClusterAvailability(activeSubClusters.keySet(),
|
|
|
|
+ blackListSubClusters);
|
|
|
|
+
|
|
if (blackListSubClusters != null) {
|
|
if (blackListSubClusters != null) {
|
|
// Remove from the active SubClusters from StateStore the blacklisted ones
|
|
// Remove from the active SubClusters from StateStore the blacklisted ones
|
|
validSubClusters.removeAll(blackListSubClusters);
|
|
validSubClusters.removeAll(blackListSubClusters);
|
|
@@ -128,20 +127,21 @@ public class LocalityRouterPolicy extends WeightedRandomRouterPolicy {
|
|
ResourceRequest nodeRequest = null;
|
|
ResourceRequest nodeRequest = null;
|
|
ResourceRequest rackRequest = null;
|
|
ResourceRequest rackRequest = null;
|
|
ResourceRequest anyRequest = null;
|
|
ResourceRequest anyRequest = null;
|
|
|
|
+
|
|
for (ResourceRequest rr : rrList) {
|
|
for (ResourceRequest rr : rrList) {
|
|
// Handle "node" requests
|
|
// Handle "node" requests
|
|
try {
|
|
try {
|
|
targetId = resolver.getSubClusterForNode(rr.getResourceName());
|
|
targetId = resolver.getSubClusterForNode(rr.getResourceName());
|
|
nodeRequest = rr;
|
|
nodeRequest = rr;
|
|
} catch (YarnException e) {
|
|
} catch (YarnException e) {
|
|
- LOG.error("Cannot resolve node : {}", e.getLocalizedMessage());
|
|
|
|
|
|
+ LOG.error("Cannot resolve node : {}.", e.getMessage());
|
|
}
|
|
}
|
|
// Handle "rack" requests
|
|
// Handle "rack" requests
|
|
try {
|
|
try {
|
|
resolver.getSubClustersForRack(rr.getResourceName());
|
|
resolver.getSubClustersForRack(rr.getResourceName());
|
|
rackRequest = rr;
|
|
rackRequest = rr;
|
|
} catch (YarnException e) {
|
|
} catch (YarnException e) {
|
|
- LOG.error("Cannot resolve rack : {}", e.getLocalizedMessage());
|
|
|
|
|
|
+ LOG.error("Cannot resolve rack : {}.", e.getMessage());
|
|
}
|
|
}
|
|
// Handle "ANY" requests
|
|
// Handle "ANY" requests
|
|
if (ResourceRequest.isAnyLocation(rr.getResourceName())) {
|
|
if (ResourceRequest.isAnyLocation(rr.getResourceName())) {
|
|
@@ -149,32 +149,33 @@ public class LocalityRouterPolicy extends WeightedRandomRouterPolicy {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
if (nodeRequest == null) {
|
|
if (nodeRequest == null) {
|
|
- throw new YarnException("Missing node request");
|
|
|
|
|
|
+ throw new YarnException("Missing node request.");
|
|
}
|
|
}
|
|
if (rackRequest == null) {
|
|
if (rackRequest == null) {
|
|
- throw new YarnException("Missing rack request");
|
|
|
|
|
|
+ throw new YarnException("Missing rack request.");
|
|
}
|
|
}
|
|
if (anyRequest == null) {
|
|
if (anyRequest == null) {
|
|
- throw new YarnException("Missing any request");
|
|
|
|
|
|
+ throw new YarnException("Missing any request.");
|
|
}
|
|
}
|
|
- LOG.info(
|
|
|
|
- "Node request: " + nodeRequest.getResourceName() + ", Rack request: "
|
|
|
|
- + rackRequest.getResourceName() + ", Any request: " + anyRequest
|
|
|
|
- .getResourceName());
|
|
|
|
|
|
+
|
|
|
|
+ LOG.info("Node request: {} , Rack request: {} , Any request: {}.",
|
|
|
|
+ nodeRequest.getResourceName(), rackRequest.getResourceName(),
|
|
|
|
+ anyRequest.getResourceName());
|
|
|
|
+
|
|
// Handle "node" requests
|
|
// Handle "node" requests
|
|
if (validSubClusters.contains(targetId) && enabledSCs
|
|
if (validSubClusters.contains(targetId) && enabledSCs
|
|
.contains(targetId)) {
|
|
.contains(targetId)) {
|
|
- LOG.info("Node {} is in SubCluster: {}", nodeRequest.getResourceName(),
|
|
|
|
- targetId);
|
|
|
|
|
|
+ LOG.info("Node {} is in SubCluster: {}.", nodeRequest.getResourceName(), targetId);
|
|
return targetId;
|
|
return targetId;
|
|
} else {
|
|
} else {
|
|
throw new YarnException("The node " + nodeRequest.getResourceName()
|
|
throw new YarnException("The node " + nodeRequest.getResourceName()
|
|
+ " is in a blacklist SubCluster or not active. ");
|
|
+ " is in a blacklist SubCluster or not active. ");
|
|
}
|
|
}
|
|
} catch (YarnException e) {
|
|
} catch (YarnException e) {
|
|
- LOG.error("Validating resource requests failed, Falling back to "
|
|
|
|
- + "WeightedRandomRouterPolicy placement: " + e.getMessage());
|
|
|
|
|
|
+ LOG.error("Validating resource requests failed, " +
|
|
|
|
+ "Falling back to WeightedRandomRouterPolicy placement : {}.", e.getMessage());
|
|
// FailForward to WeightedRandomRouterPolicy
|
|
// FailForward to WeightedRandomRouterPolicy
|
|
// Overwrite request to use a default ANY
|
|
// Overwrite request to use a default ANY
|
|
ResourceRequest amReq = Records.newRecord(ResourceRequest.class);
|
|
ResourceRequest amReq = Records.newRecord(ResourceRequest.class);
|
|
@@ -183,14 +184,10 @@ public class LocalityRouterPolicy extends WeightedRandomRouterPolicy {
|
|
amReq.setCapability(appSubmissionContext.getResource());
|
|
amReq.setCapability(appSubmissionContext.getResource());
|
|
amReq.setNumContainers(1);
|
|
amReq.setNumContainers(1);
|
|
amReq.setRelaxLocality(true);
|
|
amReq.setRelaxLocality(true);
|
|
- amReq.setNodeLabelExpression(
|
|
|
|
- appSubmissionContext.getNodeLabelExpression());
|
|
|
|
- amReq.setExecutionTypeRequest(
|
|
|
|
- ExecutionTypeRequest.newInstance(ExecutionType.GUARANTEED));
|
|
|
|
- appSubmissionContext
|
|
|
|
- .setAMContainerResourceRequests(Collections.singletonList(amReq));
|
|
|
|
- return super
|
|
|
|
- .getHomeSubcluster(appSubmissionContext, blackListSubClusters);
|
|
|
|
|
|
+ amReq.setNodeLabelExpression(appSubmissionContext.getNodeLabelExpression());
|
|
|
|
+ amReq.setExecutionTypeRequest(ExecutionTypeRequest.newInstance(ExecutionType.GUARANTEED));
|
|
|
|
+ appSubmissionContext.setAMContainerResourceRequests(Collections.singletonList(amReq));
|
|
|
|
+ return super.getHomeSubcluster(appSubmissionContext, blackListSubClusters);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|