|
@@ -1521,64 +1521,12 @@ public class CapacityScheduler extends
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- CSAssignment assignment;
|
|
|
-
|
|
|
// Assign new containers...
|
|
|
// 1. Check for reserved applications
|
|
|
// 2. Schedule if there are no reservations
|
|
|
RMContainer reservedContainer = node.getReservedContainer();
|
|
|
if (reservedContainer != null) {
|
|
|
- FiCaSchedulerApp reservedApplication = getCurrentAttemptForContainer(
|
|
|
- reservedContainer.getContainerId());
|
|
|
- if (reservedApplication == null) {
|
|
|
- LOG.error(
|
|
|
- "Trying to schedule for a finished app, please double check. nodeId="
|
|
|
- + node.getNodeID() + " container=" + reservedContainer
|
|
|
- .getContainerId());
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- // Try to fulfill the reservation
|
|
|
- LOG.debug("Trying to fulfill reservation for application {} on node: {}",
|
|
|
- reservedApplication.getApplicationId(), node.getNodeID());
|
|
|
-
|
|
|
- LeafQueue queue = ((LeafQueue) reservedApplication.getQueue());
|
|
|
- assignment = queue.assignContainers(getClusterResource(), candidates,
|
|
|
- // TODO, now we only consider limits for parent for non-labeled
|
|
|
- // resources, should consider labeled resources as well.
|
|
|
- new ResourceLimits(labelManager
|
|
|
- .getResourceByLabel(RMNodeLabelsManager.NO_LABEL,
|
|
|
- getClusterResource())),
|
|
|
- SchedulingMode.RESPECT_PARTITION_EXCLUSIVITY);
|
|
|
-
|
|
|
- if (assignment.isFulfilledReservation()) {
|
|
|
- if (withNodeHeartbeat) {
|
|
|
- // Only update SchedulerHealth in sync scheduling, existing
|
|
|
- // Data structure of SchedulerHealth need to be updated for
|
|
|
- // Async mode
|
|
|
- updateSchedulerHealth(lastNodeUpdateTime, node.getNodeID(),
|
|
|
- assignment);
|
|
|
- }
|
|
|
-
|
|
|
- schedulerHealth.updateSchedulerFulfilledReservationCounts(1);
|
|
|
-
|
|
|
- ActivitiesLogger.QUEUE.recordQueueActivity(activitiesManager, node,
|
|
|
- queue.getParent().getQueueName(), queue.getQueueName(),
|
|
|
- ActivityState.ACCEPTED, ActivityDiagnosticConstant.EMPTY);
|
|
|
- ActivitiesLogger.NODE.finishAllocatedNodeAllocation(activitiesManager,
|
|
|
- node, reservedContainer.getContainerId(),
|
|
|
- AllocationState.ALLOCATED_FROM_RESERVED);
|
|
|
- } else{
|
|
|
- ActivitiesLogger.QUEUE.recordQueueActivity(activitiesManager, node,
|
|
|
- queue.getParent().getQueueName(), queue.getQueueName(),
|
|
|
- ActivityState.ACCEPTED, ActivityDiagnosticConstant.EMPTY);
|
|
|
- ActivitiesLogger.NODE.finishAllocatedNodeAllocation(activitiesManager,
|
|
|
- node, reservedContainer.getContainerId(), AllocationState.SKIPPED);
|
|
|
- }
|
|
|
-
|
|
|
- assignment.setSchedulingMode(
|
|
|
- SchedulingMode.RESPECT_PARTITION_EXCLUSIVITY);
|
|
|
- submitResourceCommitRequest(getClusterResource(), assignment);
|
|
|
+ allocateFromReservedContainer(node, withNodeHeartbeat, reservedContainer);
|
|
|
}
|
|
|
|
|
|
// Do not schedule if there are any reservations to fulfill on the node
|
|
@@ -1603,6 +1551,62 @@ public class CapacityScheduler extends
|
|
|
return allocateOrReserveNewContainers(candidates, withNodeHeartbeat);
|
|
|
}
|
|
|
|
|
|
+ private void allocateFromReservedContainer(FiCaSchedulerNode node,
|
|
|
+ boolean withNodeHeartbeat, RMContainer reservedContainer) {
|
|
|
+ FiCaSchedulerApp reservedApplication = getCurrentAttemptForContainer(
|
|
|
+ reservedContainer.getContainerId());
|
|
|
+ if (reservedApplication == null) {
|
|
|
+ LOG.error(
|
|
|
+ "Trying to schedule for a finished app, please double check. nodeId="
|
|
|
+ + node.getNodeID() + " container=" + reservedContainer
|
|
|
+ .getContainerId());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Try to fulfill the reservation
|
|
|
+ LOG.debug("Trying to fulfill reservation for application {} on node: {}",
|
|
|
+ reservedApplication.getApplicationId(), node.getNodeID());
|
|
|
+
|
|
|
+ LeafQueue queue = ((LeafQueue) reservedApplication.getQueue());
|
|
|
+ CSAssignment assignment = queue.assignContainers(getClusterResource(),
|
|
|
+ new SimpleCandidateNodeSet<>(node),
|
|
|
+ // TODO, now we only consider limits for parent for non-labeled
|
|
|
+ // resources, should consider labeled resources as well.
|
|
|
+ new ResourceLimits(labelManager
|
|
|
+ .getResourceByLabel(RMNodeLabelsManager.NO_LABEL,
|
|
|
+ getClusterResource())),
|
|
|
+ SchedulingMode.RESPECT_PARTITION_EXCLUSIVITY);
|
|
|
+
|
|
|
+ if (assignment.isFulfilledReservation()) {
|
|
|
+ if (withNodeHeartbeat) {
|
|
|
+ // Only update SchedulerHealth in sync scheduling, existing
|
|
|
+ // Data structure of SchedulerHealth need to be updated for
|
|
|
+ // Async mode
|
|
|
+ updateSchedulerHealth(lastNodeUpdateTime, node.getNodeID(),
|
|
|
+ assignment);
|
|
|
+ }
|
|
|
+
|
|
|
+ schedulerHealth.updateSchedulerFulfilledReservationCounts(1);
|
|
|
+
|
|
|
+ ActivitiesLogger.QUEUE.recordQueueActivity(activitiesManager, node,
|
|
|
+ queue.getParent().getQueueName(), queue.getQueueName(),
|
|
|
+ ActivityState.ACCEPTED, ActivityDiagnosticConstant.EMPTY);
|
|
|
+ ActivitiesLogger.NODE.finishAllocatedNodeAllocation(activitiesManager,
|
|
|
+ node, reservedContainer.getContainerId(),
|
|
|
+ AllocationState.ALLOCATED_FROM_RESERVED);
|
|
|
+ } else{
|
|
|
+ ActivitiesLogger.QUEUE.recordQueueActivity(activitiesManager, node,
|
|
|
+ queue.getParent().getQueueName(), queue.getQueueName(),
|
|
|
+ ActivityState.ACCEPTED, ActivityDiagnosticConstant.EMPTY);
|
|
|
+ ActivitiesLogger.NODE.finishAllocatedNodeAllocation(activitiesManager,
|
|
|
+ node, reservedContainer.getContainerId(), AllocationState.SKIPPED);
|
|
|
+ }
|
|
|
+
|
|
|
+ assignment.setSchedulingMode(
|
|
|
+ SchedulingMode.RESPECT_PARTITION_EXCLUSIVITY);
|
|
|
+ submitResourceCommitRequest(getClusterResource(), assignment);
|
|
|
+ }
|
|
|
+
|
|
|
private CSAssignment allocateOrReserveNewContainers(
|
|
|
CandidateNodeSet<FiCaSchedulerNode> candidates,
|
|
|
boolean withNodeHeartbeat) {
|
|
@@ -1674,7 +1678,14 @@ public class CapacityScheduler extends
|
|
|
&& preemptionManager.getKillableResource(
|
|
|
CapacitySchedulerConfiguration.ROOT, candidates.getPartition())
|
|
|
== Resources.none()) {
|
|
|
- LOG.debug("This node or this node partition doesn't have available or"
|
|
|
+ // Try to allocate from reserved containers
|
|
|
+ for (FiCaSchedulerNode node : candidates.getAllNodes().values()) {
|
|
|
+ RMContainer reservedContainer = node.getReservedContainer();
|
|
|
+ if (reservedContainer != null) {
|
|
|
+ allocateFromReservedContainer(node, false, reservedContainer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LOG.debug("This node or this node partition doesn't have available or "
|
|
|
+ "killable resource");
|
|
|
return null;
|
|
|
}
|