|
@@ -218,6 +218,8 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
Map<String, SchedulingPolicy> queuePolicies = new HashMap<String, SchedulingPolicy>();
|
|
Map<String, SchedulingPolicy> queuePolicies = new HashMap<String, SchedulingPolicy>();
|
|
Map<String, Long> minSharePreemptionTimeouts = new HashMap<String, Long>();
|
|
Map<String, Long> minSharePreemptionTimeouts = new HashMap<String, Long>();
|
|
Map<String, Long> fairSharePreemptionTimeouts = new HashMap<String, Long>();
|
|
Map<String, Long> fairSharePreemptionTimeouts = new HashMap<String, Long>();
|
|
|
|
+ Map<String, Float> fairSharePreemptionThresholds =
|
|
|
|
+ new HashMap<String, Float>();
|
|
Map<String, Map<QueueACL, AccessControlList>> queueAcls =
|
|
Map<String, Map<QueueACL, AccessControlList>> queueAcls =
|
|
new HashMap<String, Map<QueueACL, AccessControlList>>();
|
|
new HashMap<String, Map<QueueACL, AccessControlList>>();
|
|
int userMaxAppsDefault = Integer.MAX_VALUE;
|
|
int userMaxAppsDefault = Integer.MAX_VALUE;
|
|
@@ -225,6 +227,7 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
float queueMaxAMShareDefault = -1.0f;
|
|
float queueMaxAMShareDefault = -1.0f;
|
|
long defaultFairSharePreemptionTimeout = Long.MAX_VALUE;
|
|
long defaultFairSharePreemptionTimeout = Long.MAX_VALUE;
|
|
long defaultMinSharePreemptionTimeout = Long.MAX_VALUE;
|
|
long defaultMinSharePreemptionTimeout = Long.MAX_VALUE;
|
|
|
|
+ float defaultFairSharePreemptionThreshold = 0.5f;
|
|
SchedulingPolicy defaultSchedPolicy = SchedulingPolicy.DEFAULT_POLICY;
|
|
SchedulingPolicy defaultSchedPolicy = SchedulingPolicy.DEFAULT_POLICY;
|
|
|
|
|
|
QueuePlacementPolicy newPlacementPolicy = null;
|
|
QueuePlacementPolicy newPlacementPolicy = null;
|
|
@@ -277,7 +280,8 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
int val = Integer.parseInt(text);
|
|
int val = Integer.parseInt(text);
|
|
userMaxAppsDefault = val;
|
|
userMaxAppsDefault = val;
|
|
- } else if ("defaultFairSharePreemptionTimeout".equals(element.getTagName())) {
|
|
|
|
|
|
+ } else if ("defaultFairSharePreemptionTimeout"
|
|
|
|
+ .equals(element.getTagName())) {
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
long val = Long.parseLong(text) * 1000L;
|
|
long val = Long.parseLong(text) * 1000L;
|
|
defaultFairSharePreemptionTimeout = val;
|
|
defaultFairSharePreemptionTimeout = val;
|
|
@@ -287,10 +291,17 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
long val = Long.parseLong(text) * 1000L;
|
|
long val = Long.parseLong(text) * 1000L;
|
|
defaultFairSharePreemptionTimeout = val;
|
|
defaultFairSharePreemptionTimeout = val;
|
|
}
|
|
}
|
|
- } else if ("defaultMinSharePreemptionTimeout".equals(element.getTagName())) {
|
|
|
|
|
|
+ } else if ("defaultMinSharePreemptionTimeout"
|
|
|
|
+ .equals(element.getTagName())) {
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
long val = Long.parseLong(text) * 1000L;
|
|
long val = Long.parseLong(text) * 1000L;
|
|
defaultMinSharePreemptionTimeout = val;
|
|
defaultMinSharePreemptionTimeout = val;
|
|
|
|
+ } else if ("defaultFairSharePreemptionThreshold"
|
|
|
|
+ .equals(element.getTagName())) {
|
|
|
|
+ String text = ((Text)element.getFirstChild()).getData().trim();
|
|
|
|
+ float val = Float.parseFloat(text);
|
|
|
|
+ val = Math.max(Math.min(val, 1.0f), 0.0f);
|
|
|
|
+ defaultFairSharePreemptionThreshold = val;
|
|
} else if ("queueMaxAppsDefault".equals(element.getTagName())) {
|
|
} else if ("queueMaxAppsDefault".equals(element.getTagName())) {
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
String text = ((Text)element.getFirstChild()).getData().trim();
|
|
int val = Integer.parseInt(text);
|
|
int val = Integer.parseInt(text);
|
|
@@ -326,7 +337,7 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
loadQueue(parent, element, minQueueResources, maxQueueResources,
|
|
loadQueue(parent, element, minQueueResources, maxQueueResources,
|
|
queueMaxApps, userMaxApps, queueMaxAMShares, queueWeights,
|
|
queueMaxApps, userMaxApps, queueMaxAMShares, queueWeights,
|
|
queuePolicies, minSharePreemptionTimeouts, fairSharePreemptionTimeouts,
|
|
queuePolicies, minSharePreemptionTimeouts, fairSharePreemptionTimeouts,
|
|
- queueAcls, configuredQueues);
|
|
|
|
|
|
+ fairSharePreemptionThresholds, queueAcls, configuredQueues);
|
|
}
|
|
}
|
|
|
|
|
|
// Load placement policy and pass it configured queues
|
|
// Load placement policy and pass it configured queues
|
|
@@ -349,11 +360,18 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
defaultFairSharePreemptionTimeout);
|
|
defaultFairSharePreemptionTimeout);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // Set the fair share preemption threshold for the root queue
|
|
|
|
+ if (!fairSharePreemptionThresholds.containsKey(QueueManager.ROOT_QUEUE)) {
|
|
|
|
+ fairSharePreemptionThresholds.put(QueueManager.ROOT_QUEUE,
|
|
|
|
+ defaultFairSharePreemptionThreshold);
|
|
|
|
+ }
|
|
|
|
+
|
|
AllocationConfiguration info = new AllocationConfiguration(minQueueResources,
|
|
AllocationConfiguration info = new AllocationConfiguration(minQueueResources,
|
|
maxQueueResources, queueMaxApps, userMaxApps, queueWeights,
|
|
maxQueueResources, queueMaxApps, userMaxApps, queueWeights,
|
|
queueMaxAMShares, userMaxAppsDefault, queueMaxAppsDefault,
|
|
queueMaxAMShares, userMaxAppsDefault, queueMaxAppsDefault,
|
|
queueMaxAMShareDefault, queuePolicies, defaultSchedPolicy,
|
|
queueMaxAMShareDefault, queuePolicies, defaultSchedPolicy,
|
|
- minSharePreemptionTimeouts, fairSharePreemptionTimeouts, queueAcls,
|
|
|
|
|
|
+ minSharePreemptionTimeouts, fairSharePreemptionTimeouts,
|
|
|
|
+ fairSharePreemptionThresholds, queueAcls,
|
|
newPlacementPolicy, configuredQueues);
|
|
newPlacementPolicy, configuredQueues);
|
|
|
|
|
|
lastSuccessfulReload = clock.getTime();
|
|
lastSuccessfulReload = clock.getTime();
|
|
@@ -365,13 +383,15 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
/**
|
|
/**
|
|
* Loads a queue from a queue element in the configuration file
|
|
* Loads a queue from a queue element in the configuration file
|
|
*/
|
|
*/
|
|
- private void loadQueue(String parentName, Element element, Map<String, Resource> minQueueResources,
|
|
|
|
|
|
+ private void loadQueue(String parentName, Element element,
|
|
|
|
+ Map<String, Resource> minQueueResources,
|
|
Map<String, Resource> maxQueueResources, Map<String, Integer> queueMaxApps,
|
|
Map<String, Resource> maxQueueResources, Map<String, Integer> queueMaxApps,
|
|
Map<String, Integer> userMaxApps, Map<String, Float> queueMaxAMShares,
|
|
Map<String, Integer> userMaxApps, Map<String, Float> queueMaxAMShares,
|
|
Map<String, ResourceWeights> queueWeights,
|
|
Map<String, ResourceWeights> queueWeights,
|
|
Map<String, SchedulingPolicy> queuePolicies,
|
|
Map<String, SchedulingPolicy> queuePolicies,
|
|
Map<String, Long> minSharePreemptionTimeouts,
|
|
Map<String, Long> minSharePreemptionTimeouts,
|
|
Map<String, Long> fairSharePreemptionTimeouts,
|
|
Map<String, Long> fairSharePreemptionTimeouts,
|
|
|
|
+ Map<String, Float> fairSharePreemptionThresholds,
|
|
Map<String, Map<QueueACL, AccessControlList>> queueAcls,
|
|
Map<String, Map<QueueACL, AccessControlList>> queueAcls,
|
|
Map<FSQueueType, Set<String>> configuredQueues)
|
|
Map<FSQueueType, Set<String>> configuredQueues)
|
|
throws AllocationConfigurationException {
|
|
throws AllocationConfigurationException {
|
|
@@ -418,6 +438,11 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
String text = ((Text)field.getFirstChild()).getData().trim();
|
|
String text = ((Text)field.getFirstChild()).getData().trim();
|
|
long val = Long.parseLong(text) * 1000L;
|
|
long val = Long.parseLong(text) * 1000L;
|
|
fairSharePreemptionTimeouts.put(queueName, val);
|
|
fairSharePreemptionTimeouts.put(queueName, val);
|
|
|
|
+ } else if ("fairSharePreemptionThreshold".equals(field.getTagName())) {
|
|
|
|
+ String text = ((Text)field.getFirstChild()).getData().trim();
|
|
|
|
+ float val = Float.parseFloat(text);
|
|
|
|
+ val = Math.max(Math.min(val, 1.0f), 0.0f);
|
|
|
|
+ fairSharePreemptionThresholds.put(queueName, val);
|
|
} else if ("schedulingPolicy".equals(field.getTagName())
|
|
} else if ("schedulingPolicy".equals(field.getTagName())
|
|
|| "schedulingMode".equals(field.getTagName())) {
|
|
|| "schedulingMode".equals(field.getTagName())) {
|
|
String text = ((Text)field.getFirstChild()).getData().trim();
|
|
String text = ((Text)field.getFirstChild()).getData().trim();
|
|
@@ -434,7 +459,8 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
loadQueue(queueName, field, minQueueResources, maxQueueResources,
|
|
loadQueue(queueName, field, minQueueResources, maxQueueResources,
|
|
queueMaxApps, userMaxApps, queueMaxAMShares, queueWeights,
|
|
queueMaxApps, userMaxApps, queueMaxAMShares, queueWeights,
|
|
queuePolicies, minSharePreemptionTimeouts,
|
|
queuePolicies, minSharePreemptionTimeouts,
|
|
- fairSharePreemptionTimeouts, queueAcls, configuredQueues);
|
|
|
|
|
|
+ fairSharePreemptionTimeouts, fairSharePreemptionThresholds,
|
|
|
|
+ queueAcls, configuredQueues);
|
|
configuredQueues.get(FSQueueType.PARENT).add(queueName);
|
|
configuredQueues.get(FSQueueType.PARENT).add(queueName);
|
|
isLeaf = false;
|
|
isLeaf = false;
|
|
}
|
|
}
|
|
@@ -449,11 +475,15 @@ public class AllocationFileLoaderService extends AbstractService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
queueAcls.put(queueName, acls);
|
|
queueAcls.put(queueName, acls);
|
|
- if (maxQueueResources.containsKey(queueName) && minQueueResources.containsKey(queueName)
|
|
|
|
|
|
+ if (maxQueueResources.containsKey(queueName) &&
|
|
|
|
+ minQueueResources.containsKey(queueName)
|
|
&& !Resources.fitsIn(minQueueResources.get(queueName),
|
|
&& !Resources.fitsIn(minQueueResources.get(queueName),
|
|
maxQueueResources.get(queueName))) {
|
|
maxQueueResources.get(queueName))) {
|
|
- LOG.warn(String.format("Queue %s has max resources %s less than min resources %s",
|
|
|
|
- queueName, maxQueueResources.get(queueName), minQueueResources.get(queueName)));
|
|
|
|
|
|
+ LOG.warn(
|
|
|
|
+ String.format(
|
|
|
|
+ "Queue %s has max resources %s less than min resources %s",
|
|
|
|
+ queueName, maxQueueResources.get(queueName),
|
|
|
|
+ minQueueResources.get(queueName)));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|