From b046bb3e3491fa34bec033460700f6b6b310682b Mon Sep 17 00:00:00 2001 From: Sunil G Date: Fri, 20 Jul 2018 07:05:20 +0530 Subject: [PATCH] YARN-7863 --- .../yarn/api/resource/PlacementConstraints.java | 2 + .../util/constraint/PlacementConstraintParser.java | 239 ++++++++++++++++++++- .../resource/TestPlacementConstraintParser.java | 23 +- .../distributedshell/ApplicationMaster.java | 77 ++++++- .../distributedshell/AttributeSpec.java | 88 ++++++++ .../yarn/applications/distributedshell/Client.java | 16 ++ .../server/resourcemanager/ResourceManager.java | 2 + .../nodelabels/NodeAttributesManagerImpl.java | 20 ++ .../resourcemanager/scheduler/SchedulerNode.java | 10 + .../scheduler/capacity/CapacityScheduler.java | 34 +++ .../constraint/PlacementConstraintsUtil.java | 74 +++++-- .../event/NodeAttributesUpdateSchedulerEvent.java | 39 ++++ .../scheduler/event/SchedulerEventType.java | 1 + .../SingleConstraintAppPlacementAllocator.java | 34 ++- .../hadoop-yarn-ui/src/main/webapp/.bowerrc | 3 +- 15 files changed, 626 insertions(+), 36 deletions(-) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/AttributeSpec.java create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/event/NodeAttributesUpdateSchedulerEvent.java diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/resource/PlacementConstraints.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/resource/PlacementConstraints.java index d22a6bd90c0..20c78f7278d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/resource/PlacementConstraints.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/resource/PlacementConstraints.java @@ -49,6 +49,8 @@ private PlacementConstraints() { public static final String NODE = PlacementConstraint.NODE_SCOPE; public static final String RACK = PlacementConstraint.RACK_SCOPE; public static final String NODE_PARTITION = "yarn_node_partition/"; + public static final String DIST_NODE_ATTRIBUTES = "nm.yarn.io/"; + public static final String CENTRAL_NODE_ATTRIBUTES = "rm.yarn.io/"; /** * Creates a constraint that requires allocations to be placed on nodes that diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/constraint/PlacementConstraintParser.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/constraint/PlacementConstraintParser.java index 2926c9d1de8..00610ef1fec 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/constraint/PlacementConstraintParser.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/util/constraint/PlacementConstraintParser.java @@ -53,10 +53,16 @@ private static final String NOT_IN = "notin"; private static final String AND = "and"; private static final String OR = "or"; + private static final String EQUALS = "="; + private static final String NOT_EQUALS = "!="; private static final String CARDINALITY = "cardinality"; private static final String SCOPE_NODE = PlacementConstraints.NODE; private static final String SCOPE_RACK = PlacementConstraints.RACK; + public enum TargetExprType { + NODE_ATTRIBUTE, ALLOCATION_TAG + } + private PlacementConstraintParser() { // Private constructor for this utility class. } @@ -349,6 +355,136 @@ public String nextElement() { } } + /** + * Tokenizer used to handle a placement spec composed by multiple + * constraint expressions. Each of them is delimited with the + * given delimiter, e.g ':'. + */ + public static class NodeConstraintsTokenizer + implements ConstraintTokenizer { + + private final String expr; + private Iterator iterator; + + public NodeConstraintsTokenizer(String expression) { + this.expr = expression; + } + + @Override + public void validate() throws PlacementConstraintParseException { + ArrayList parsedElements = new ArrayList<>(); + char[] arr = expr.toCharArray(); + + Stack stack = new Stack<>(); + for (int i=0; i> nodeToAttributes; + + public NodeAttributesUpdateSchedulerEvent( + Map> newNodeToAttributesMap) { + super(SchedulerEventType.NODE_ATTRIBUTES_UPDATE); + this.nodeToAttributes = newNodeToAttributesMap; + } + + public Map> getUpdatedNodeToAttributes() { + return nodeToAttributes; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/event/SchedulerEventType.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/event/SchedulerEventType.java index b107cf4ee61..869bf0ed9e4 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/event/SchedulerEventType.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/event/SchedulerEventType.java @@ -26,6 +26,7 @@ NODE_UPDATE, NODE_RESOURCE_UPDATE, NODE_LABELS_UPDATE, + NODE_ATTRIBUTES_UPDATE, // Source: RMApp APP_ADDED, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java index 1fc6badbe6a..bcb1fba58da 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/SingleConstraintAppPlacementAllocator.java @@ -29,6 +29,7 @@ import org.apache.hadoop.yarn.api.records.SchedulingRequest; import org.apache.hadoop.yarn.api.records.impl.pb.SchedulingRequestPBImpl; import org.apache.hadoop.yarn.api.resource.PlacementConstraint; +import org.apache.hadoop.yarn.api.resource.PlacementConstraint.TargetExpression; import org.apache.hadoop.yarn.api.resource.PlacementConstraints; import org.apache.hadoop.yarn.exceptions.SchedulerInvalidResoureRequestException; import org.apache.hadoop.yarn.server.resourcemanager.RMContext; @@ -69,6 +70,7 @@ private SchedulingRequest schedulingRequest = null; private String targetNodePartition; + private Set targetNodeAttributes; private Set targetAllocationTags; private AllocationTagsManager allocationTagsManager; private PlacementConstraintManager placementConstraintManager; @@ -283,6 +285,9 @@ private void validateAndSetSchedulingRequest(SchedulingRequest // Target allocation tags Set targetAllocationTags = null; + // Set Node Attributes + Set nodeAttributes = null; + for (PlacementConstraint.TargetExpression targetExpression : targetExpressionSet) { // Handle node partition if (targetExpression.getTargetType().equals( @@ -290,9 +295,9 @@ private void validateAndSetSchedulingRequest(SchedulingRequest // For node attribute target, we only support Partition now. And once // YARN-3409 is merged, we will support node attribute. if (!targetExpression.getTargetKey().equals(NODE_PARTITION)) { - throwExceptionWithMetaInfo("When TargetType=" - + PlacementConstraint.TargetExpression.TargetType.NODE_ATTRIBUTE - + " only " + NODE_PARTITION + " is accepted as TargetKey."); + nodeAttributes = handleNodeAttributeFromSchedulingRequest( + targetExpression); + continue; } if (nodePartition != null) { @@ -351,14 +356,29 @@ private void validateAndSetSchedulingRequest(SchedulingRequest // Validation is done. set local results: this.targetNodePartition = nodePartition; this.targetAllocationTags = targetAllocationTags; + this.targetNodeAttributes = nodeAttributes; this.schedulingRequest = new SchedulingRequestPBImpl( ((SchedulingRequestPBImpl) newSchedulingRequest).getProto()); - LOG.info("Successfully added SchedulingRequest to app=" + appSchedulingInfo - .getApplicationAttemptId() + " targetAllocationTags=[" + StringUtils - .join(",", targetAllocationTags) + "]. nodePartition=" - + targetNodePartition); + LOG.info("Successfully added SchedulingRequest to app=" + + appSchedulingInfo.getApplicationAttemptId() + + " targetAllocationTags=[" + + StringUtils.join(",", targetAllocationTags) + "]. nodePartition=" + + targetNodePartition + " targetNodeAttributes=[" + + StringUtils.join(",", targetNodeAttributes) + "]"); + } + + private Set handleNodeAttributeFromSchedulingRequest( + TargetExpression targetExpression) { + Set nodeAttributes = new HashSet(); + Set values = targetExpression.getTargetValues(); + if (values == null || values.isEmpty()) { + return nodeAttributes; + } + + nodeAttributes.addAll(values); + return nodeAttributes; } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/.bowerrc b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/.bowerrc index 959e1696e7b..daf4462c44a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/.bowerrc +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/src/main/webapp/.bowerrc @@ -1,4 +1,5 @@ { "directory": "bower_components", - "analytics": false + "analytics": false, + "registry": "https://registry.bower.io" } -- 2.14.3 (Apple Git-98)