diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java index b361d15..7bf52e1 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/SchedulerApplicationAttempt.java @@ -141,7 +141,8 @@ protected boolean isStopped = false; protected final RMContext rmContext; - + private boolean amContainerAssigned; + public SchedulerApplicationAttempt(ApplicationAttemptId applicationAttemptId, String user, Queue queue, ActiveUsersManager activeUsersManager, RMContext rmContext) { @@ -470,8 +471,7 @@ public ContainersAndNMTokensAllocation(List containerList, RMContainer rmContainer = i.next(); Container container = rmContainer.getContainer(); ContainerType containerType = ContainerType.TASK; - boolean isWaitingForAMContainer = isWaitingForAMContainer( - container.getId().getApplicationAttemptId().getApplicationId()); + boolean isWaitingForAMContainer = isWaitingForAMContainer(); if (isWaitingForAMContainer) { containerType = ContainerType.APPLICATION_MASTER; } @@ -502,13 +502,19 @@ public ContainersAndNMTokensAllocation(List containerList, return new ContainersAndNMTokensAllocation(returnContainerList, nmTokens); } - public boolean isWaitingForAMContainer(ApplicationId applicationId) { + public boolean isWaitingForAMContainer() { // The working knowledge is that masterContainer for AM is null as it // itself is the master container. - RMAppAttempt appAttempt = - rmContext.getRMApps().get(applicationId).getCurrentAppAttempt(); - return (appAttempt != null && appAttempt.getMasterContainer() == null - && appAttempt.getSubmissionContext().getUnmanagedAM() == false); + if (unmanagedAM) { + return false; + } + if (!amContainerAssigned) { + RMAppAttempt appAttempt = + rmContext.getRMApps().get(getApplicationId()).getCurrentAppAttempt(); + amContainerAssigned = + appAttempt != null && appAttempt.getMasterContainer() != null; + } + return amContainerAssigned; } // Blacklist used for user containers @@ -530,7 +536,7 @@ public synchronized void updateAMBlacklist( } public boolean isBlacklisted(String resourceName) { - boolean useAMBlacklist = isWaitingForAMContainer(getApplicationId()); + boolean useAMBlacklist = isWaitingForAMContainer(); return this.appSchedulingInfo.isBlacklisted(resourceName, useAMBlacklist); } diff --git 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 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 ad5c76c..1ce8cfd 100644 --- 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 +++ 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 @@ -889,7 +889,7 @@ public Allocation allocate(ApplicationAttemptId applicationAttemptId, } } - if (application.isWaitingForAMContainer(application.getApplicationId())) { + if (application.isWaitingForAMContainer()) { // Allocate is for AM and update AM blacklist for this application.updateAMBlacklist( blacklistAdditions, blacklistRemovals); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index 3a39799..4822fdc 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -955,7 +955,7 @@ public Allocation allocate(ApplicationAttemptId appAttemptId, preemptionContainerIds.add(container.getContainerId()); } - if (application.isWaitingForAMContainer(application.getApplicationId())) { + if (application.isWaitingForAMContainer()) { // Allocate is for AM and update AM blacklist for this application.updateAMBlacklist( blacklistAdditions, blacklistRemovals); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java index 99760df..f0336b2 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fifo/FifoScheduler.java @@ -356,7 +356,7 @@ public Allocation allocate( " #ask=" + ask.size()); } - if (application.isWaitingForAMContainer(application.getApplicationId())) { + if (application.isWaitingForAMContainer()) { // Allocate is for AM and update AM blacklist for this application.updateAMBlacklist( blacklistAdditions, blacklistRemovals);