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 f4f97936c55..c6406db67c2 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 @@ -889,7 +889,8 @@ ApplicationPlacementContext placeApplication( ApplicationPlacementContext placementContext = null; if (placementManager != null) { try { - placementContext = placementManager.placeApplication(context, user); + String usernameUsedForPlacement = getUserNameForPlacement(user, context, placementManager); + placementContext = placementManager.placeApplication(context, usernameUsedForPlacement); } catch (YarnException e) { // Placement could also fail if the user doesn't exist in system // skip if the user is not found during recovery. @@ -916,6 +917,37 @@ ApplicationPlacementContext placeApplication( return placementContext; } + private String getUserNameForPlacement(final String user, final ApplicationSubmissionContext context, + PlacementManager placementManager) throws YarnException { + String usernameUsedForPlacement = user; + Set applicationTags = context.getApplicationTags(); + String userNameFromAppTag = getUserNameFromApplicationTag(applicationTags); + if (userNameFromAppTag != null) { + LOG.debug("Found [{0}] userId in application tag", userNameFromAppTag); + UserGroupInformation callerUGI ; + callerUGI = UserGroupInformation.createRemoteUser(userNameFromAppTag); + String queue = placementManager.placeApplication(context, usernameUsedForPlacement).getQueue(); + if (callerUGI != null && scheduler.checkAccess(callerUGI, QueueACL.ADMINISTER_QUEUE, queue)) { + usernameUsedForPlacement = userNameFromAppTag; + } else { + LOG.warn("User [{0}] from application tag does not have access to [{1}] queue. " + + "The placement is done for [{2}] user", userNameFromAppTag, queue, user); + } + } + return usernameUsedForPlacement; + } + + private String getUserNameFromApplicationTag(Set applicationTags) { + String userIdTag = null; + String userIdPrefix = "userid="; + for (String tag: applicationTags) { + if (tag.startsWith(userIdPrefix)) { + userIdTag = tag.split("=")[1]; // here userNameFromAppTag = maria and user = hive + } + } + return userIdTag; + } + private void copyPlacementQueueToSubmissionContext( ApplicationPlacementContext placementContext, ApplicationSubmissionContext context) {