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/SchedulerUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerUtils.java index aadcb55c429..0e0303cf6fc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerUtils.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerUtils.java @@ -252,7 +252,8 @@ private static void normalizeNodeLabelExpressionInRequest( // set it to be NO_LABEL in case of a pre-configured queue. Dynamic // queues are handled in RMAppAttemptImp.ScheduledTransition if (labelExp == null && queueInfo != null) { - labelExp = RMNodeLabelsManager.NO_LABEL; + //https://issues.apache.org/jira/browse/YARN-10899 + //labelExp = RMNodeLabelsManager.NO_LABEL; } if (labelExp != null) { 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/capacity/allocator/RegularContainerAllocator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java index cced238b601..8212abe6098 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/allocator/RegularContainerAllocator.java @@ -41,6 +41,7 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceLimits; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerAppUtils; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.placement.AppPlacementAllocator; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.placement.LocalityAppPlacementAllocator; import org.apache.hadoop.yarn.server.scheduler.SchedulerRequestKey; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.activities.ActivityDiagnosticConstant; @@ -207,6 +208,25 @@ private ContainerAllocation preCheckForNodeCandidateSet( } if (schedulingMode == SchedulingMode.IGNORE_PARTITION_EXCLUSIVITY) { + if(appPlacementAllocator instanceof LocalityAppPlacementAllocator){ + String requestPartitionAllowdNull = + ((LocalityAppPlacementAllocator) appPlacementAllocator) + .getPrimaryRequestedNodePartitionAllowedNull(); + if (RMNodeLabelsManager.NO_LABEL.equals(requestPartitionAllowdNull) { + if (LOG.isDebugEnabled()) { + LOG.debug("Skip allocating container to app_attempt=" + + application.getApplicationAttemptId() + + ", don't allow to allocate container in non-exclusive mode " + + "because default node-label(empty string) expression is explicitly set "); + } + application.updateAppSkipNodeDiagnostics( + "Skipping assigning to Node in Ignore Exclusivity mode because default node-label expression(empty string) is explicitly set"); + ActivitiesLogger.APP.recordSkippedAppActivityWithoutAllocation( + activitiesManager, node, application, priority, + ActivityDiagnosticConstant.SKIP_IN_IGNORE_EXCLUSIVITY_MODE); + return ContainerAllocation.APP_SKIPPED; + } + } // Before doing allocation, we need to check scheduling opportunity to // make sure : non-partitioned resource request should be scheduled to // non-partitioned partition first. 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/LocalityAppPlacementAllocator.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/LocalityAppPlacementAllocator.java index 19ba719c30b..e2489b8e6e6 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/LocalityAppPlacementAllocator.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/LocalityAppPlacementAllocator.java @@ -57,6 +57,7 @@ new ConcurrentHashMap<>(); private volatile String primaryRequestedPartition = RMNodeLabelsManager.NO_LABEL; + private volatile String primaryRequestedPartitionAllowedNull = null; private final ReentrantReadWriteLock.ReadLock readLock; private final ReentrantReadWriteLock.WriteLock writeLock; @@ -145,6 +146,7 @@ public PendingAskUpdateResult updatePendingAsk( request.getNodeLabelExpression(); this.primaryRequestedPartition = partition; + this.primaryRequestedPartitionAllowedNull = request.getNodeLabelExpression(); //update the applications requested labels set appSchedulingInfo.addRequestedPartition(partition); @@ -389,6 +391,10 @@ public String getPrimaryRequestedNodePartition() { return primaryRequestedPartition; } + public String getPrimaryRequestedNodePartitionAllowedNull() { + return primaryRequestedPartitionAllowedNull; + } + @Override public int getUniqueLocationAsks() { return resourceRequestMap.size(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java index f916264a59f..61780591507 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestAppManager.java @@ -704,9 +704,11 @@ public void testRMAppSubmitAMContainerResourceRequests() throws Exception { Assert.assertEquals(reqs.get(0), asContext.getAMContainerResourceRequest()); Assert.assertEquals(reqs, asContext.getAMContainerResourceRequests()); RMApp app = testRMAppSubmit(); + /* for (ResourceRequest req : reqs) { req.setNodeLabelExpression(RMNodeLabelsManager.NO_LABEL); } + */ // setAMContainerResourceRequests has priority over // setAMContainerResourceRequest and setResource @@ -744,7 +746,7 @@ public void testRMAppSubmitResource() throws Exception { Assert.assertEquals(Collections.singletonList( ResourceRequest.newInstance(RMAppAttemptImpl.AM_CONTAINER_PRIORITY, ResourceRequest.ANY, Resources.createResource(1024), 1, true, - "")), + null)), app.getAMResourceRequests()); }