|
@@ -26,6 +26,7 @@ import org.apache.hadoop.yarn.api.records.Resource;
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.MockNM;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.MockRM;
|
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceLimits;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler;
|
|
import org.junit.Assert;
|
|
import org.junit.Assert;
|
|
import org.junit.Test;
|
|
import org.junit.Test;
|
|
@@ -38,6 +39,7 @@ public class TestAbsoluteResourceConfiguration {
|
|
private static final String QUEUEA = "queueA";
|
|
private static final String QUEUEA = "queueA";
|
|
private static final String QUEUEB = "queueB";
|
|
private static final String QUEUEB = "queueB";
|
|
private static final String QUEUEC = "queueC";
|
|
private static final String QUEUEC = "queueC";
|
|
|
|
+ private static final String QUEUED = "queueD";
|
|
private static final String QUEUEA1 = "queueA1";
|
|
private static final String QUEUEA1 = "queueA1";
|
|
private static final String QUEUEA2 = "queueA2";
|
|
private static final String QUEUEA2 = "queueA2";
|
|
private static final String QUEUEB1 = "queueB1";
|
|
private static final String QUEUEB1 = "queueB1";
|
|
@@ -48,6 +50,9 @@ public class TestAbsoluteResourceConfiguration {
|
|
+ "." + QUEUEB;
|
|
+ "." + QUEUEB;
|
|
private static final String QUEUEC_FULL = CapacitySchedulerConfiguration.ROOT
|
|
private static final String QUEUEC_FULL = CapacitySchedulerConfiguration.ROOT
|
|
+ "." + QUEUEC;
|
|
+ "." + QUEUEC;
|
|
|
|
+ private static final String QUEUED_FULL = CapacitySchedulerConfiguration.ROOT
|
|
|
|
+ + "." + QUEUED;
|
|
|
|
+
|
|
private static final String QUEUEA1_FULL = QUEUEA_FULL + "." + QUEUEA1;
|
|
private static final String QUEUEA1_FULL = QUEUEA_FULL + "." + QUEUEA1;
|
|
private static final String QUEUEA2_FULL = QUEUEA_FULL + "." + QUEUEA2;
|
|
private static final String QUEUEA2_FULL = QUEUEA_FULL + "." + QUEUEA2;
|
|
private static final String QUEUEB1_FULL = QUEUEB_FULL + "." + QUEUEB1;
|
|
private static final String QUEUEB1_FULL = QUEUEB_FULL + "." + QUEUEB1;
|
|
@@ -66,15 +71,23 @@ public class TestAbsoluteResourceConfiguration {
|
|
10);
|
|
10);
|
|
private static final Resource QUEUE_B_MAXRES = Resource.newInstance(150 * GB,
|
|
private static final Resource QUEUE_B_MAXRES = Resource.newInstance(150 * GB,
|
|
30);
|
|
30);
|
|
- private static final Resource QUEUE_C_MINRES = Resource.newInstance(50 * GB,
|
|
|
|
- 10);
|
|
|
|
|
|
+ private static final Resource QUEUE_C_MINRES = Resource.newInstance(25 * GB,
|
|
|
|
+ 5);
|
|
private static final Resource QUEUE_C_MAXRES = Resource.newInstance(150 * GB,
|
|
private static final Resource QUEUE_C_MAXRES = Resource.newInstance(150 * GB,
|
|
20);
|
|
20);
|
|
|
|
+ private static final Resource QUEUE_D_MINRES = Resource.newInstance(25 * GB,
|
|
|
|
+ 5);
|
|
|
|
+ private static final Resource QUEUE_D_MAXRES = Resource.newInstance(150 * GB,
|
|
|
|
+ 20);
|
|
private static final Resource QUEUEA_REDUCED = Resource.newInstance(64000, 6);
|
|
private static final Resource QUEUEA_REDUCED = Resource.newInstance(64000, 6);
|
|
private static final Resource QUEUEB_REDUCED = Resource.newInstance(32000, 6);
|
|
private static final Resource QUEUEB_REDUCED = Resource.newInstance(32000, 6);
|
|
- private static final Resource QUEUEC_REDUCED = Resource.newInstance(32000, 6);
|
|
|
|
|
|
+ private static final Resource QUEUEC_REDUCED = Resource.newInstance(16000, 3);
|
|
private static final Resource QUEUEMAX_REDUCED = Resource.newInstance(128000,
|
|
private static final Resource QUEUEMAX_REDUCED = Resource.newInstance(128000,
|
|
20);
|
|
20);
|
|
|
|
+ private static final Resource QUEUE_D_TEMPL_MINRES =
|
|
|
|
+ Resource.newInstance(25 * GB, 5);
|
|
|
|
+ private static final Resource QUEUE_D_TEMPL_MAXRES =
|
|
|
|
+ Resource.newInstance(150 * GB, 20);
|
|
|
|
|
|
private static Set<String> resourceTypes = new HashSet<>(
|
|
private static Set<String> resourceTypes = new HashSet<>(
|
|
Arrays.asList("memory", "vcores"));
|
|
Arrays.asList("memory", "vcores"));
|
|
@@ -83,15 +96,24 @@ public class TestAbsoluteResourceConfiguration {
|
|
boolean isCapacityNeeded) {
|
|
boolean isCapacityNeeded) {
|
|
CapacitySchedulerConfiguration csConf = new CapacitySchedulerConfiguration();
|
|
CapacitySchedulerConfiguration csConf = new CapacitySchedulerConfiguration();
|
|
csConf.setQueues(CapacitySchedulerConfiguration.ROOT,
|
|
csConf.setQueues(CapacitySchedulerConfiguration.ROOT,
|
|
- new String[]{QUEUEA, QUEUEB, QUEUEC});
|
|
|
|
|
|
+ new String[]{QUEUEA, QUEUEB, QUEUEC, QUEUED});
|
|
|
|
|
|
// Set default capacities like normal configuration.
|
|
// Set default capacities like normal configuration.
|
|
if (isCapacityNeeded) {
|
|
if (isCapacityNeeded) {
|
|
csConf.setCapacity(QUEUEA_FULL, 50f);
|
|
csConf.setCapacity(QUEUEA_FULL, 50f);
|
|
csConf.setCapacity(QUEUEB_FULL, 25f);
|
|
csConf.setCapacity(QUEUEB_FULL, 25f);
|
|
csConf.setCapacity(QUEUEC_FULL, 25f);
|
|
csConf.setCapacity(QUEUEC_FULL, 25f);
|
|
|
|
+ csConf.setCapacity(QUEUED_FULL, 25f);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ csConf.setAutoCreateChildQueueEnabled(QUEUED_FULL, true);
|
|
|
|
+
|
|
|
|
+ // Setup leaf queue template configs
|
|
|
|
+ csConf.setAutoCreatedLeafQueueTemplateCapacityByLabel(QUEUED_FULL, "",
|
|
|
|
+ QUEUE_D_TEMPL_MINRES);
|
|
|
|
+ csConf.setAutoCreatedLeafQueueTemplateMaxCapacity(QUEUED_FULL, "",
|
|
|
|
+ QUEUE_D_TEMPL_MAXRES);
|
|
|
|
+
|
|
return csConf;
|
|
return csConf;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -122,10 +144,12 @@ public class TestAbsoluteResourceConfiguration {
|
|
csConf.setMinimumResourceRequirement("", QUEUEA_FULL, QUEUE_A_MINRES);
|
|
csConf.setMinimumResourceRequirement("", QUEUEA_FULL, QUEUE_A_MINRES);
|
|
csConf.setMinimumResourceRequirement("", QUEUEB_FULL, QUEUE_B_MINRES);
|
|
csConf.setMinimumResourceRequirement("", QUEUEB_FULL, QUEUE_B_MINRES);
|
|
csConf.setMinimumResourceRequirement("", QUEUEC_FULL, QUEUE_C_MINRES);
|
|
csConf.setMinimumResourceRequirement("", QUEUEC_FULL, QUEUE_C_MINRES);
|
|
|
|
+ csConf.setMinimumResourceRequirement("", QUEUED_FULL, QUEUE_D_MINRES);
|
|
|
|
|
|
csConf.setMaximumResourceRequirement("", QUEUEA_FULL, QUEUE_A_MAXRES);
|
|
csConf.setMaximumResourceRequirement("", QUEUEA_FULL, QUEUE_A_MAXRES);
|
|
csConf.setMaximumResourceRequirement("", QUEUEB_FULL, QUEUE_B_MAXRES);
|
|
csConf.setMaximumResourceRequirement("", QUEUEB_FULL, QUEUE_B_MAXRES);
|
|
csConf.setMaximumResourceRequirement("", QUEUEC_FULL, QUEUE_C_MAXRES);
|
|
csConf.setMaximumResourceRequirement("", QUEUEC_FULL, QUEUE_C_MAXRES);
|
|
|
|
+ csConf.setMaximumResourceRequirement("", QUEUED_FULL, QUEUE_D_MAXRES);
|
|
|
|
|
|
return csConf;
|
|
return csConf;
|
|
}
|
|
}
|
|
@@ -148,9 +172,10 @@ public class TestAbsoluteResourceConfiguration {
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
- public void testSimpleMinMaxResourceConfigurartionPerQueue() {
|
|
|
|
|
|
+ public void testSimpleMinMaxResourceConfigurartionPerQueue()
|
|
|
|
+ throws Exception {
|
|
|
|
|
|
- CapacitySchedulerConfiguration csConf = setupSimpleQueueConfiguration(true);
|
|
|
|
|
|
+ CapacitySchedulerConfiguration csConf = setupSimpleQueueConfiguration(false);
|
|
setupMinMaxResourceConfiguration(csConf);
|
|
setupMinMaxResourceConfiguration(csConf);
|
|
|
|
|
|
Assert.assertEquals("Min resource configured for QUEUEA is not correct",
|
|
Assert.assertEquals("Min resource configured for QUEUEA is not correct",
|
|
@@ -171,6 +196,69 @@ public class TestAbsoluteResourceConfiguration {
|
|
Assert.assertEquals("Max resource configured for QUEUEC is not correct",
|
|
Assert.assertEquals("Max resource configured for QUEUEC is not correct",
|
|
QUEUE_C_MAXRES,
|
|
QUEUE_C_MAXRES,
|
|
csConf.getMaximumResourceRequirement("", QUEUEC_FULL, resourceTypes));
|
|
csConf.getMaximumResourceRequirement("", QUEUEC_FULL, resourceTypes));
|
|
|
|
+
|
|
|
|
+ csConf.setClass(YarnConfiguration.RM_SCHEDULER, CapacityScheduler.class,
|
|
|
|
+ ResourceScheduler.class);
|
|
|
|
+
|
|
|
|
+ @SuppressWarnings("resource")
|
|
|
|
+ MockRM rm = new MockRM(csConf);
|
|
|
|
+ rm.start();
|
|
|
|
+
|
|
|
|
+ // Add few nodes
|
|
|
|
+ rm.registerNode("127.0.0.1:1234", 250 * GB, 40);
|
|
|
|
+
|
|
|
|
+ // Get queue object to verify min/max resource configuration.
|
|
|
|
+ CapacityScheduler cs = (CapacityScheduler) rm.getResourceScheduler();
|
|
|
|
+
|
|
|
|
+ ManagedParentQueue parentQueue = (ManagedParentQueue) cs.getQueue(QUEUED);
|
|
|
|
+ AutoCreatedLeafQueue d1 = new AutoCreatedLeafQueue(cs, "d1", parentQueue);
|
|
|
|
+ cs.addQueue(d1);
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * After adding child queue d1, it occupies all entire resource
|
|
|
|
+ * of Managed Parent queue
|
|
|
|
+ */
|
|
|
|
+ cs.getRootQueue().updateClusterResource(cs.getClusterResource(),
|
|
|
|
+ new ResourceLimits(cs.getClusterResource()));
|
|
|
|
+
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MINRES,
|
|
|
|
+ d1.queueResourceQuotas.getConfiguredMinResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MINRES,
|
|
|
|
+ d1.queueResourceQuotas.getEffectiveMinResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MAXRES,
|
|
|
|
+ d1.queueResourceQuotas.getConfiguredMaxResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MAXRES,
|
|
|
|
+ d1.queueResourceQuotas.getEffectiveMaxResource());
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * After adding child queue d2, adjustment happens and both d1 and d2 shares
|
|
|
|
+ * resource of Managed Parent Queue
|
|
|
|
+ */
|
|
|
|
+ AutoCreatedLeafQueue d2 = new AutoCreatedLeafQueue(cs, "d2", parentQueue);
|
|
|
|
+ cs.addQueue(d2);
|
|
|
|
+
|
|
|
|
+ cs.getRootQueue().updateClusterResource(cs.getClusterResource(),
|
|
|
|
+ new ResourceLimits(cs.getClusterResource()));
|
|
|
|
+
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MINRES,
|
|
|
|
+ d2.queueResourceQuotas.getConfiguredMinResource());
|
|
|
|
+ Assert.assertEquals(Resource.newInstance(12800, 2),
|
|
|
|
+ d2.queueResourceQuotas.getEffectiveMinResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MAXRES,
|
|
|
|
+ d2.queueResourceQuotas.getConfiguredMaxResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MAXRES,
|
|
|
|
+ d2.queueResourceQuotas.getEffectiveMaxResource());
|
|
|
|
+
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MINRES,
|
|
|
|
+ d1.queueResourceQuotas.getConfiguredMinResource());
|
|
|
|
+ Assert.assertEquals(Resource.newInstance(12800, 2),
|
|
|
|
+ d1.queueResourceQuotas.getEffectiveMinResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MAXRES,
|
|
|
|
+ d1.queueResourceQuotas.getConfiguredMaxResource());
|
|
|
|
+ Assert.assertEquals(QUEUE_D_TEMPL_MAXRES,
|
|
|
|
+ d1.queueResourceQuotas.getEffectiveMaxResource());
|
|
|
|
+
|
|
|
|
+ rm.close();
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -578,7 +666,7 @@ public class TestAbsoluteResourceConfiguration {
|
|
Assert.assertEquals("Effective Max resource for QUEUEC is not correct",
|
|
Assert.assertEquals("Effective Max resource for QUEUEC is not correct",
|
|
QUEUE_C_MAXRES, qC.queueResourceQuotas.getEffectiveMaxResource());
|
|
QUEUE_C_MAXRES, qC.queueResourceQuotas.getEffectiveMaxResource());
|
|
Assert.assertEquals("Absolute capacity for QUEUEC is not correct",
|
|
Assert.assertEquals("Absolute capacity for QUEUEC is not correct",
|
|
- 0.2, qC.getAbsoluteCapacity(), DELTA);
|
|
|
|
|
|
+ 0.1, qC.getAbsoluteCapacity(), DELTA);
|
|
Assert.assertEquals("Absolute Max capacity for QUEUEC is not correct",
|
|
Assert.assertEquals("Absolute Max capacity for QUEUEC is not correct",
|
|
0.6, qC.getAbsoluteMaximumCapacity(), DELTA);
|
|
0.6, qC.getAbsoluteMaximumCapacity(), DELTA);
|
|
|
|
|
|
@@ -645,7 +733,7 @@ public class TestAbsoluteResourceConfiguration {
|
|
Assert.assertEquals("Effective Max resource for QUEUEC is not correct",
|
|
Assert.assertEquals("Effective Max resource for QUEUEC is not correct",
|
|
QUEUE_C_MAXRES, qC.queueResourceQuotas.getEffectiveMaxResource());
|
|
QUEUE_C_MAXRES, qC.queueResourceQuotas.getEffectiveMaxResource());
|
|
Assert.assertEquals("Absolute capacity for QUEUEC is not correct",
|
|
Assert.assertEquals("Absolute capacity for QUEUEC is not correct",
|
|
- 0.133, qC.getAbsoluteCapacity(), DELTA);
|
|
|
|
|
|
+ 0.066, qC.getAbsoluteCapacity(), DELTA);
|
|
Assert.assertEquals("Absolute Max capacity for QUEUEC is not correct",
|
|
Assert.assertEquals("Absolute Max capacity for QUEUEC is not correct",
|
|
0.4, qC.getAbsoluteMaximumCapacity(), DELTA);
|
|
0.4, qC.getAbsoluteMaximumCapacity(), DELTA);
|
|
|
|
|