Explorar o código

YARN-9209. When nodePartition is not set in Placement Constraints, containers are allocated only in default partition. Contributed by Tarun Parimi.

Weiwei Yang %!s(int64=5) %!d(string=hai) anos
pai
achega
83dcb9d87e

+ 14 - 0
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/AppSchedulingInfo.java

@@ -795,4 +795,18 @@ public class AppSchedulingInfo {
   public Map<String, String> getApplicationSchedulingEnvs() {
     return applicationSchedulingEnvs;
   }
+
+  /**
+   * Get the defaultNodeLabelExpression for the application's current queue.
+   *
+   * @return defaultNodeLabelExpression
+   */
+  public String getDefaultNodeLabelExpression() {
+    try {
+      this.readLock.lock();
+      return queue.getDefaultNodeLabelExpression();
+    } finally {
+      this.readLock.unlock();
+    }
+  }
 }

+ 4 - 1
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

@@ -255,7 +255,10 @@ public class SingleConstraintAppPlacementAllocator<N extends SchedulerNode>
   // Currently only single constraint is handled.
   private String validateAndGetTargetNodePartition(
       PlacementConstraint placementConstraint) {
-    String nodePartition = RMNodeLabelsManager.NO_LABEL;
+    String defaultNodeLabelExpression =
+        appSchedulingInfo.getDefaultNodeLabelExpression();
+    String nodePartition = defaultNodeLabelExpression == null ?
+        RMNodeLabelsManager.NO_LABEL : defaultNodeLabelExpression;
     if (placementConstraint != null &&
         placementConstraint.getConstraintExpr() != null) {
       PlacementConstraint.AbstractConstraint ac =

+ 4 - 3
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/placement/TestSingleConstraintAppPlacementAllocator.java

@@ -67,7 +67,7 @@ public class TestSingleConstraintAppPlacementAllocator {
         TestUtils.getMockApplicationId(1));
     when(appSchedulingInfo.getApplicationAttemptId()).thenReturn(
         TestUtils.getMockApplicationAttemptId(1, 1));
-
+    when(appSchedulingInfo.getDefaultNodeLabelExpression()).thenReturn("y");
     // stub RMContext
     rmContext = TestUtils.getMockRMContext();
 
@@ -153,7 +153,8 @@ public class TestSingleConstraintAppPlacementAllocator {
         .resourceSizing(
             ResourceSizing.newInstance(1, Resource.newInstance(1024, 1)))
         .build());
-    Assert.assertEquals("", allocator.getTargetNodePartition());
+    // Node partition is unspecified, use the default node label expression y
+    Assert.assertEquals("y", allocator.getTargetNodePartition());
 
     // Valid (with application Id target)
     assertValidSchedulingRequest(SchedulingRequest.newBuilder().executionType(
@@ -167,7 +168,7 @@ public class TestSingleConstraintAppPlacementAllocator {
             ResourceSizing.newInstance(1, Resource.newInstance(1024, 1)))
         .build());
     // Allocation tags should not include application Id
-    Assert.assertEquals("", allocator.getTargetNodePartition());
+    Assert.assertEquals("y", allocator.getTargetNodePartition());
 
     // Invalid (without sizing)
     assertInvalidSchedulingRequest(SchedulingRequest.newBuilder().executionType(