From f9db5d04de9b1c3bd7738befc7fc9be56a26b7bd Mon Sep 17 00:00:00 2001 From: Gergely Pollak Date: Wed, 9 Dec 2020 17:42:17 +0100 Subject: [PATCH] YARN-10526 RMAppManager CS Placement ignores parent path Change-Id: I17149b068bfde2806062ccb639852354a9e5bcb8 --- .../server/resourcemanager/RMAppManager.java | 16 ++++++++++++- .../scheduler/capacity/CapacityScheduler.java | 23 ++++++++++++++++--- ...CapacitySchedulerAutoCreatedQueueBase.java | 2 +- ...estCapacitySchedulerAutoQueueCreation.java | 11 +++++++-- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java index 13c2ec7de4c..25ff384c742 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/RMAppManager.java @@ -500,11 +500,25 @@ private RMAppImpl createAndPopulateNewRMApp( } } + //In the case of capacity scheduler the queue name only means the name of + // the leaf queue, but since YARN-9879, internal queue references should + // use full path, so we get the queue and parent name from the placement + // context instead of the submissionContext. + String placementQueueName = submissionContext.getQueue(); + if (placementContext != null && scheduler instanceof CapacityScheduler) { + if (placementContext.hasParentQueue()) { + placementQueueName = placementContext.getParentQueue() + "." + + placementContext.getQueue(); + } else { + placementQueueName = placementContext.getQueue(); + } + } + // Create RMApp RMAppImpl application = new RMAppImpl(applicationId, rmContext, this.conf, submissionContext.getApplicationName(), user, - submissionContext.getQueue(), + placementQueueName, submissionContext, this.scheduler, this.masterService, submitTime, submissionContext.getApplicationType(), submissionContext.getApplicationTags(), amReqs, placementContext, 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/CapacityScheduler.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/CapacityScheduler.java index 51df2242be3..b38eee568d9 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/CapacityScheduler.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/CapacityScheduler.java @@ -1835,6 +1835,23 @@ CSAssignment allocateContainersToNode( return assignment; } + private String getAddedAppQueueName(AppAddedSchedulerEvent appAddedEvent) { + String ret = appAddedEvent.getQueue(); + ApplicationPlacementContext placementContext = + appAddedEvent.getPlacementContext(); + + if (placementContext != null) { + String leafName = placementContext.getQueue(); + String parentName = placementContext.getParentQueue(); + if (leafName != null) { + ret = placementContext.hasParentQueue() ? + (parentName + "." + leafName) : leafName; + } + } + + return ret; + } + @Override public void handle(SchedulerEvent event) { switch(event.getType()) { @@ -1886,9 +1903,9 @@ public void handle(SchedulerEvent event) { case APP_ADDED: { AppAddedSchedulerEvent appAddedEvent = (AppAddedSchedulerEvent) event; - String queueName = resolveReservationQueueName(appAddedEvent.getQueue(), - appAddedEvent.getApplicationId(), appAddedEvent.getReservationID(), - appAddedEvent.getIsAppRecovering()); + String queueName = resolveReservationQueueName( + getAddedAppQueueName(appAddedEvent), appAddedEvent.getApplicationId(), + appAddedEvent.getReservationID(), appAddedEvent.getIsAppRecovering()); if (queueName != null) { if (!appAddedEvent.getIsAppRecovering()) { addApplication(appAddedEvent.getApplicationId(), queueName, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java index 4757cd79a07..b83059e9e14 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoCreatedQueueBase.java @@ -420,7 +420,7 @@ public static CapacitySchedulerConfiguration setupQueueConfiguration( (C, NODEL_LABEL_SSD); - LOG.info("Setup " + C + " as an auto leaf creation enabled parent queue"); + LOG.info("Setup " + D + " as an auto leaf creation enabled parent queue"); conf.setUserLimitFactor(D, 1.0f); conf.setAutoCreateChildQueueEnabled(D, true); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java index 084a177048f..675306b6dd7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerAutoQueueCreation.java @@ -501,7 +501,12 @@ public void testParentQueueUpdateInQueueMappingFailsAfterAutoCreation() assertNotNull(newCS.getQueue(USER0)); - setupQueueMapping(newCS, USER0, "d", USER0); + //The new placement engine's placement engine validation is a bit more + //strict so it would reject the original u:user_0:a.user_0 rule since + //it checks if that paths exists or is a managed parent, but if we use + //a.%user we can trick the engine, since it cannot validate if the actual + //value of the %user will exist or not, it allows the rule + setupQueueMapping(newCS, USER0, "a", "%user"); newCS.updatePlacementRules(); RMContext rmContext = mock(RMContext.class); @@ -509,8 +514,10 @@ public void testParentQueueUpdateInQueueMappingFailsAfterAutoCreation() newCS.setRMContext(rmContext); ApplicationId appId = BuilderUtils.newApplicationId(1, 1); + //The new engine would return root.a as the parent queue for this + // submission so creating the ApplicationPlacementContext accordingly SchedulerEvent addAppEvent = new AppAddedSchedulerEvent(appId, USER0, - USER0, new ApplicationPlacementContext(USER0, "d")); + USER0, new ApplicationPlacementContext(USER0, "root.a")); newCS.handle(addAppEvent); RMAppEvent event = new RMAppEvent(appId, RMAppEventType.APP_REJECTED, -- 2.26.2