YARN-10316. FS-CS converter: convert maxAppsDefault, maxRunningApps settings. Contributed by Peter Bacsko

This commit is contained in:
Szilard Nemeth 2020-06-23 12:13:04 +02:00
parent fa14e4bc00
commit 03f855e3e7
6 changed files with 78 additions and 77 deletions

View File

@ -83,6 +83,9 @@ public class FSConfigToCSConfigConverter {
private boolean preemptionEnabled = false; private boolean preemptionEnabled = false;
private int queueMaxAppsDefault; private int queueMaxAppsDefault;
private float queueMaxAMShareDefault; private float queueMaxAMShareDefault;
private Map<String, Integer> userMaxApps;
private int userMaxAppsDefault;
private boolean autoCreateChildQueues = false; private boolean autoCreateChildQueues = false;
private boolean sizeBasedWeight = false; private boolean sizeBasedWeight = false;
private boolean userAsDefaultQueue = false; private boolean userAsDefaultQueue = false;
@ -99,6 +102,8 @@ public class FSConfigToCSConfigConverter {
private boolean consoleMode = false; private boolean consoleMode = false;
private boolean convertPlacementRules = false; private boolean convertPlacementRules = false;
public FSConfigToCSConfigConverter(FSConfigToCSConfigRuleHandler public FSConfigToCSConfigConverter(FSConfigToCSConfigRuleHandler
ruleHandler, ConversionOptions conversionOptions) { ruleHandler, ConversionOptions conversionOptions) {
this.ruleHandler = ruleHandler; this.ruleHandler = ruleHandler;
@ -242,14 +247,13 @@ public class FSConfigToCSConfigConverter {
AllocationConfiguration allocConf = fs.getAllocationConfiguration(); AllocationConfiguration allocConf = fs.getAllocationConfiguration();
queueMaxAppsDefault = allocConf.getQueueMaxAppsDefault(); queueMaxAppsDefault = allocConf.getQueueMaxAppsDefault();
userMaxAppsDefault = allocConf.getUserMaxAppsDefault();
userMaxApps = allocConf.getUserMaxApps();
queueMaxAMShareDefault = allocConf.getQueueMaxAMShareDefault(); queueMaxAMShareDefault = allocConf.getQueueMaxAMShareDefault();
convertedYarnSiteConfig = new Configuration(false); convertedYarnSiteConfig = new Configuration(false);
capacitySchedulerConfig = new Configuration(false); capacitySchedulerConfig = new Configuration(false);
checkUserMaxApps(allocConf);
checkUserMaxAppsDefault(allocConf);
convertYarnSiteXml(inputYarnSiteConfig, havePlacementPolicies); convertYarnSiteXml(inputYarnSiteConfig, havePlacementPolicies);
convertCapacitySchedulerXml(fs); convertCapacitySchedulerXml(fs);
@ -287,7 +291,9 @@ public class FSConfigToCSConfigConverter {
private void convertCapacitySchedulerXml(FairScheduler fs) { private void convertCapacitySchedulerXml(FairScheduler fs) {
FSParentQueue rootQueue = fs.getQueueManager().getRootQueue(); FSParentQueue rootQueue = fs.getQueueManager().getRootQueue();
emitDefaultMaxApplications(); emitDefaultQueueMaxParallelApplications();
emitDefaultUserMaxParallelApplications();
emitUserMaxParallelApplications();
emitDefaultMaxAMShare(); emitDefaultMaxAMShare();
FSQueueConverter queueConverter = FSQueueConverterBuilder.create() FSQueueConverter queueConverter = FSQueueConverterBuilder.create()
@ -322,14 +328,30 @@ public class FSConfigToCSConfigConverter {
} }
} }
private void emitDefaultMaxApplications() { private void emitDefaultQueueMaxParallelApplications() {
if (queueMaxAppsDefault != Integer.MAX_VALUE) { if (queueMaxAppsDefault != Integer.MAX_VALUE) {
capacitySchedulerConfig.set( capacitySchedulerConfig.set(
CapacitySchedulerConfiguration.MAXIMUM_SYSTEM_APPLICATIONS, PREFIX + "max-parallel-apps",
String.valueOf(queueMaxAppsDefault)); String.valueOf(queueMaxAppsDefault));
} }
} }
private void emitDefaultUserMaxParallelApplications() {
if (userMaxAppsDefault != Integer.MAX_VALUE) {
capacitySchedulerConfig.set(
PREFIX + "user.max-parallel-apps",
String.valueOf(userMaxAppsDefault));
}
}
private void emitUserMaxParallelApplications() {
userMaxApps
.forEach((user, apps) -> {
capacitySchedulerConfig.setInt(
PREFIX + "user." + user + ".max-parallel-apps", apps);
});
}
private void emitDefaultMaxAMShare() { private void emitDefaultMaxAMShare() {
if (queueMaxAMShareDefault == QUEUE_MAX_AM_SHARE_DISABLED) { if (queueMaxAMShareDefault == QUEUE_MAX_AM_SHARE_DISABLED) {
capacitySchedulerConfig.setFloat( capacitySchedulerConfig.setFloat(
@ -374,19 +396,6 @@ public class FSConfigToCSConfigConverter {
} }
} }
private void checkUserMaxApps(AllocationConfiguration allocConf) {
if (allocConf.getUserMaxApps() != null
&& allocConf.getUserMaxApps().size() > 0) {
ruleHandler.handleUserMaxApps();
}
}
private void checkUserMaxAppsDefault(AllocationConfiguration allocConf) {
if (allocConf.getUserMaxAppsDefault() > 0) {
ruleHandler.handleUserMaxAppsDefault();
}
}
private boolean isDrfUsed(FairScheduler fs) { private boolean isDrfUsed(FairScheduler fs) {
FSQueue rootQueue = fs.getQueueManager().getRootQueue(); FSQueue rootQueue = fs.getQueueManager().getRootQueue();
AllocationConfiguration allocConf = fs.getAllocationConfiguration(); AllocationConfiguration allocConf = fs.getAllocationConfiguration();

View File

@ -170,14 +170,6 @@ public class FSConfigToCSConfigRuleHandler {
} }
} }
public void handleUserMaxApps() {
handle(USER_MAX_RUNNING_APPS, "<maxRunningApps>", null);
}
public void handleUserMaxAppsDefault() {
handle(USER_MAX_APPS_DEFAULT, "<userMaxAppsDefault>", null);
}
public void handleDynamicMaxAssign() { public void handleDynamicMaxAssign() {
handle(DYNAMIC_MAX_ASSIGN, handle(DYNAMIC_MAX_ASSIGN,
FairSchedulerConfiguration.DYNAMIC_MAX_ASSIGN, null); FairSchedulerConfiguration.DYNAMIC_MAX_ASSIGN, null);

View File

@ -43,7 +43,7 @@ import org.apache.hadoop.yarn.util.resource.Resources;
*/ */
public class FSQueueConverter { public class FSQueueConverter {
public static final float QUEUE_MAX_AM_SHARE_DISABLED = -1.0f; public static final float QUEUE_MAX_AM_SHARE_DISABLED = -1.0f;
private static final int MAX_RUNNING_APPS_UNSET = Integer.MIN_VALUE; private static final int MAX_RUNNING_APPS_UNSET = Integer.MAX_VALUE;
private static final String FAIR_POLICY = "fair"; private static final String FAIR_POLICY = "fair";
private static final String FIFO_POLICY = "fifo"; private static final String FIFO_POLICY = "fifo";
@ -79,7 +79,7 @@ public class FSQueueConverter {
emitChildQueues(queueName, children); emitChildQueues(queueName, children);
emitMaxAMShare(queueName, queue); emitMaxAMShare(queueName, queue);
emitMaxRunningApps(queueName, queue); emitMaxParallelApps(queueName, queue);
emitMaxAllocations(queueName, queue); emitMaxAllocations(queueName, queue);
emitPreemptionDisabled(queueName, queue); emitPreemptionDisabled(queueName, queue);
@ -138,14 +138,14 @@ public class FSQueueConverter {
/** /**
* &lt;maxRunningApps&gt; * &lt;maxRunningApps&gt;
* ==> yarn.scheduler.capacity.&lt;queue-name&gt;.maximum-applications. * ==> yarn.scheduler.capacity.&lt;queue-name&gt;.max-parallel-apps.
* @param queueName * @param queueName
* @param queue * @param queue
*/ */
private void emitMaxRunningApps(String queueName, FSQueue queue) { private void emitMaxParallelApps(String queueName, FSQueue queue) {
if (queue.getMaxRunningApps() != MAX_RUNNING_APPS_UNSET if (queue.getMaxRunningApps() != MAX_RUNNING_APPS_UNSET
&& queue.getMaxRunningApps() != queueMaxAppsDefault) { && queue.getMaxRunningApps() != queueMaxAppsDefault) {
capacitySchedulerConfig.set(PREFIX + queueName + ".maximum-applications", capacitySchedulerConfig.set(PREFIX + queueName + ".max-parallel-apps",
String.valueOf(queue.getMaxRunningApps())); String.valueOf(queue.getMaxRunningApps()));
} }
} }

View File

@ -155,17 +155,7 @@ public class TestFSConfigToCSConfigConverter {
.withOutputDirectory(FSConfigConverterTestCommons.OUTPUT_DIR); .withOutputDirectory(FSConfigConverterTestCommons.OUTPUT_DIR);
} }
@Test
public void testDefaultMaxApplications() throws Exception {
converter.convert(config);
Configuration conf = converter.getCapacitySchedulerConfig();
int maxApps =
conf.getInt(
CapacitySchedulerConfiguration.MAXIMUM_SYSTEM_APPLICATIONS, -1);
assertEquals("Default max apps", 15, maxApps);
}
@Test @Test
public void testDefaultMaxAMShare() throws Exception { public void testDefaultMaxAMShare() throws Exception {
@ -252,14 +242,52 @@ public class TestFSConfigToCSConfigConverter {
} }
@Test @Test
public void testDefaultMaxRunningApps() throws Exception { public void testDefaultQueueMaxParallelApps() throws Exception {
converter.convert(config); converter.convert(config);
Configuration conf = converter.getCapacitySchedulerConfig(); Configuration conf = converter.getCapacitySchedulerConfig();
// default setting assertEquals("Default max parallel apps", 15,
assertEquals("Default max apps", 15, conf.getInt(PREFIX + "max-parallel-apps", -1));
conf.getInt(PREFIX + "maximum-applications", -1)); }
@Test
public void testSpecificQueueMaxParallelApps() throws Exception {
converter.convert(config);
Configuration conf = converter.getCapacitySchedulerConfig();
assertEquals("root.admins.alice max parallel apps", 2,
conf.getInt(PREFIX + "root.admins.alice.max-parallel-apps", -1));
}
@Test
public void testDefaultUserMaxParallelApps() throws Exception {
converter.convert(config);
Configuration conf = converter.getCapacitySchedulerConfig();
int userMaxParallelApps =
conf.getInt(
PREFIX + "user.max-parallel-apps", -1);
assertEquals("Default user max parallel apps", 10,
userMaxParallelApps);
}
@Test
public void testSpecificUserMaxParallelApps() throws Exception {
converter.convert(config);
Configuration conf = converter.getCapacitySchedulerConfig();
assertEquals("Max parallel apps for alice", 30,
conf.getInt(PREFIX + "user.alice.max-parallel-apps", -1));
assertNull("Max parallel apps should be undefined for user bob",
conf.get(PREFIX + "user.bob.max-parallel-apps"));
assertNull("Max parallel apps should be undefined for user joe",
conf.get(PREFIX + "user.joe.max-parallel-apps"));
assertNull("Max parallel apps should be undefined for user john",
conf.get(PREFIX + "user.john.max-parallel-apps"));
} }
@Test @Test
@ -285,28 +313,6 @@ public class TestFSConfigToCSConfigConverter {
converter.convert(config); converter.convert(config);
} }
@Test
public void testUserMaxAppsNotSupported() throws Exception {
expectedException.expect(UnsupportedPropertyException.class);
expectedException.expectMessage("userMaxApps");
Mockito.doThrow(new UnsupportedPropertyException("userMaxApps"))
.when(ruleHandler).handleUserMaxApps();
converter.convert(config);
}
@Test
public void testUserMaxAppsDefaultNotSupported() throws Exception {
expectedException.expect(UnsupportedPropertyException.class);
expectedException.expectMessage("userMaxAppsDefault");
Mockito.doThrow(new UnsupportedPropertyException("userMaxAppsDefault"))
.when(ruleHandler).handleUserMaxAppsDefault();
converter.convert(config);
}
@Test @Test
public void testConvertFSConfigurationClusterResource() throws Exception { public void testConvertFSConfigurationClusterResource() throws Exception {
FSConfigToCSConfigConverterParams params = createDefaultParamsBuilder() FSConfigToCSConfigConverterParams params = createDefaultParamsBuilder()

View File

@ -76,8 +76,6 @@ public class TestFSConfigToCSConfigRuleHandler {
ruleHandler.handleQueueAutoCreate("test"); ruleHandler.handleQueueAutoCreate("test");
ruleHandler.handleReservationSystem(); ruleHandler.handleReservationSystem();
ruleHandler.handleSpecifiedNotFirstRule(); ruleHandler.handleSpecifiedNotFirstRule();
ruleHandler.handleUserMaxApps();
ruleHandler.handleUserMaxAppsDefault();
} }
@Test @Test
@ -106,8 +104,6 @@ public class TestFSConfigToCSConfigRuleHandler {
ruleHandler.handleQueueAutoCreate("test"); ruleHandler.handleQueueAutoCreate("test");
ruleHandler.handleReservationSystem(); ruleHandler.handleReservationSystem();
ruleHandler.handleSpecifiedNotFirstRule(); ruleHandler.handleSpecifiedNotFirstRule();
ruleHandler.handleUserMaxApps();
ruleHandler.handleUserMaxAppsDefault();
} }
@Test @Test
@ -140,8 +136,6 @@ public class TestFSConfigToCSConfigRuleHandler {
expectAbort(() -> ruleHandler.handleQueueAutoCreate("test")); expectAbort(() -> ruleHandler.handleQueueAutoCreate("test"));
expectAbort(() -> ruleHandler.handleReservationSystem()); expectAbort(() -> ruleHandler.handleReservationSystem());
expectAbort(() -> ruleHandler.handleSpecifiedNotFirstRule()); expectAbort(() -> ruleHandler.handleSpecifiedNotFirstRule());
expectAbort(() -> ruleHandler.handleUserMaxApps());
expectAbort(() -> ruleHandler.handleUserMaxAppsDefault());
expectAbort(() -> ruleHandler.handleFairAsDrf("test")); expectAbort(() -> ruleHandler.handleFairAsDrf("test"));
} }

View File

@ -195,18 +195,18 @@ public class TestFSQueueConverter {
} }
@Test @Test
public void testQueueMaxRunningApps() { public void testQueueMaxParallelApps() {
converter = builder.build(); converter = builder.build();
converter.convertQueueHierarchy(rootQueue); converter.convertQueueHierarchy(rootQueue);
assertEquals("root.admins.alice max apps", 2, assertEquals("root.admins.alice max apps", 2,
csConfig.getInt(PREFIX + "root.admins.alice.maximum-applications", csConfig.getInt(PREFIX + "root.admins.alice.max-parallel-apps",
-1)); -1));
Set<String> remaining = Sets.difference(ALL_QUEUES, Set<String> remaining = Sets.difference(ALL_QUEUES,
Sets.newHashSet("root.admins.alice")); Sets.newHashSet("root.admins.alice"));
assertNoValueForQueues(remaining, ".maximum-applications", csConfig); assertNoValueForQueues(remaining, ".max-parallel-apps", csConfig);
} }
@Test @Test