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 f03d7d1f2e8..7171feaaee1 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 @@ -2554,7 +2554,8 @@ public boolean attemptAllocationOnNode(SchedulerApplicationAttempt appAttempt, allocationsList = new ArrayList<>(); allocationsList.add(allocated); - return new ResourceCommitRequest<>(allocationsList, null, null); + return new ResourceCommitRequest<>(allocationsList, null, null, + schedulingRequest.getAllocationTags()); } return null; } @@ -2629,7 +2630,7 @@ public boolean attemptAllocationOnNode(SchedulerApplicationAttempt appAttempt, } return new ResourceCommitRequest<>(allocationsList, reservationsList, - released); + released, null); } return 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/common/ResourceCommitRequest.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/ResourceCommitRequest.java index 5aca2028105..88e565ac346 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/ResourceCommitRequest.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/ResourceCommitRequest.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.List; +import java.util.Set; public class ResourceCommitRequest { @@ -44,10 +45,16 @@ private Resource totalReservedResource; private Resource totalReleasedResource; + private Set allocationTags; + public ResourceCommitRequest( List> containersToAllocate, List> containersToReserve, - List> toReleaseContainers) { + List> toReleaseContainers, + Set tags) { + if (null != tags) { + this.allocationTags = tags; + } if (null != containersToAllocate) { this.containersToAllocate = containersToAllocate; } @@ -146,6 +153,10 @@ public boolean anythingAllocatedOrReserved() { return c; } + public Set getAllocationTags() { + return allocationTags; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); 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/common/fica/FiCaSchedulerApp.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java index 4ea03470413..7c2e082800a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/common/fica/FiCaSchedulerApp.java @@ -78,6 +78,8 @@ import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.PendingAsk; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.ResourceCommitRequest; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.SchedulerContainer; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.constraint.InvalidAllocationTagsQueryException; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.constraint.PlacementConstraintsUtil; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.placement.AppPlacementAllocator; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.placement.CandidateNodeSet; import org.apache.hadoop.yarn.server.scheduler.SchedulerRequestKey; @@ -408,6 +410,26 @@ public boolean accept(Resource cluster, containerRequest = schedulerContainer.getRmContainer().getContainerRequest(); + // Validate placement constraint is satisfied with this allocation. + try { + if (!checkPending && !PlacementConstraintsUtil + .canSatisfyConstraints( + getApplicationId(), request.getAllocationTags(), + schedulerContainer.getSchedulerNode(), + rmContext.getPlacementConstraintManager(), + rmContext.getAllocationTagsManager())) { + LOG.debug("Failed to allocate container for application " + + getApplicationId() + " on node " + + schedulerContainer.getSchedulerNode() + + " because this allocation violates the" + + " placement constraint."); + return false; + } + } catch (InvalidAllocationTagsQueryException e) { + LOG.warn("Unable to allocate container", e); + return false; + } + // Check pending resource request if (checkPending && !appSchedulingInfo.checkAllocation( 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/TestCapacitySchedulerAsyncScheduling.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/TestCapacitySchedulerAsyncScheduling.java index 6cb21d4e6ca..6c6de543b86 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/TestCapacitySchedulerAsyncScheduling.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/TestCapacitySchedulerAsyncScheduling.java @@ -258,7 +258,7 @@ public void testCommitProposalForFailedAppAttempt() List reservedProposals = new ArrayList<>(); reservedProposals.add(reservedForAttempt1Proposal); ResourceCommitRequest request = - new ResourceCommitRequest(null, reservedProposals, null); + new ResourceCommitRequest(null, reservedProposals, null, null); scheduler.tryCommit(scheduler.getClusterResource(), request, true); Assert.assertNull("Outdated proposal should not be accepted!", sn2.getReservedContainer()); @@ -467,7 +467,7 @@ public void testNodeResourceOverAllocated() List newProposals = new ArrayList<>(); newProposals.add(newContainerProposal); ResourceCommitRequest request = - new ResourceCommitRequest(newProposals, null, null); + new ResourceCommitRequest(newProposals, null, null, null); scheduler.tryCommit(scheduler.getClusterResource(), request, true); } // make sure node resource can't be over-allocated!