YARN-10175. FS-CS converter: only convert placement rules if a cmd line switch is defined. Contributed by Peter Bacsko
This commit is contained in:
parent
edc2e9d2f1
commit
c0d084247c
@ -98,6 +98,10 @@ public enum CliOption {
|
|||||||
"Disables checking whether a placement rule is terminal to maintain" +
|
"Disables checking whether a placement rule is terminal to maintain" +
|
||||||
" backward compatibility with configs that were made before YARN-8967.",
|
" backward compatibility with configs that were made before YARN-8967.",
|
||||||
false),
|
false),
|
||||||
|
CONVERT_PLACEMENT_RULES("convert placement rules",
|
||||||
|
"m", "convert-placement-rules",
|
||||||
|
"Convert Fair Scheduler placement rules to Capacity" +
|
||||||
|
" Scheduler mapping rules", false),
|
||||||
HELP("help", "h", "help", "Displays the list of options", false);
|
HELP("help", "h", "help", "Displays the list of options", false);
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
@ -216,6 +220,8 @@ private FSConfigToCSConfigConverterParams validateInputFiles(
|
|||||||
cliParser.getOptionValue(CliOption.CONVERSION_RULES.shortSwitch);
|
cliParser.getOptionValue(CliOption.CONVERSION_RULES.shortSwitch);
|
||||||
String outputDir =
|
String outputDir =
|
||||||
cliParser.getOptionValue(CliOption.OUTPUT_DIR.shortSwitch);
|
cliParser.getOptionValue(CliOption.OUTPUT_DIR.shortSwitch);
|
||||||
|
boolean convertPlacementRules =
|
||||||
|
cliParser.hasOption(CliOption.CONVERT_PLACEMENT_RULES.shortSwitch);
|
||||||
|
|
||||||
checkFile(CliOption.YARN_SITE, yarnSiteXmlFile);
|
checkFile(CliOption.YARN_SITE, yarnSiteXmlFile);
|
||||||
checkFile(CliOption.FAIR_SCHEDULER, fairSchedulerXmlFile);
|
checkFile(CliOption.FAIR_SCHEDULER, fairSchedulerXmlFile);
|
||||||
@ -231,6 +237,7 @@ private FSConfigToCSConfigConverterParams validateInputFiles(
|
|||||||
cliParser.getOptionValue(CliOption.CLUSTER_RESOURCE.shortSwitch))
|
cliParser.getOptionValue(CliOption.CLUSTER_RESOURCE.shortSwitch))
|
||||||
.withConsole(cliParser.hasOption(CliOption.CONSOLE_MODE.shortSwitch))
|
.withConsole(cliParser.hasOption(CliOption.CONSOLE_MODE.shortSwitch))
|
||||||
.withOutputDirectory(outputDir)
|
.withOutputDirectory(outputDir)
|
||||||
|
.withConvertPlacementRules(convertPlacementRules)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,10 +91,12 @@ public class FSConfigToCSConfigConverter {
|
|||||||
private Configuration convertedYarnSiteConfig;
|
private Configuration convertedYarnSiteConfig;
|
||||||
private Configuration capacitySchedulerConfig;
|
private Configuration capacitySchedulerConfig;
|
||||||
private FSConfigToCSConfigRuleHandler ruleHandler;
|
private FSConfigToCSConfigRuleHandler ruleHandler;
|
||||||
|
private QueuePlacementConverter placementConverter;
|
||||||
|
|
||||||
private OutputStream yarnSiteOutputStream;
|
private OutputStream yarnSiteOutputStream;
|
||||||
private OutputStream capacitySchedulerOutputStream;
|
private OutputStream capacitySchedulerOutputStream;
|
||||||
private boolean consoleMode = false;
|
private boolean consoleMode = false;
|
||||||
|
private boolean convertPlacementRules = false;
|
||||||
|
|
||||||
public FSConfigToCSConfigConverter(FSConfigToCSConfigRuleHandler
|
public FSConfigToCSConfigConverter(FSConfigToCSConfigRuleHandler
|
||||||
ruleHandler, ConversionOptions conversionOptions) {
|
ruleHandler, ConversionOptions conversionOptions) {
|
||||||
@ -102,6 +104,7 @@ public FSConfigToCSConfigConverter(FSConfigToCSConfigRuleHandler
|
|||||||
this.conversionOptions = conversionOptions;
|
this.conversionOptions = conversionOptions;
|
||||||
this.yarnSiteOutputStream = System.out;
|
this.yarnSiteOutputStream = System.out;
|
||||||
this.capacitySchedulerOutputStream = System.out;
|
this.capacitySchedulerOutputStream = System.out;
|
||||||
|
this.placementConverter = new QueuePlacementConverter();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convert(FSConfigToCSConfigConverterParams params)
|
public void convert(FSConfigToCSConfigConverterParams params)
|
||||||
@ -113,6 +116,8 @@ public void convert(FSConfigToCSConfigConverterParams params)
|
|||||||
handleFairSchedulerConfig(params, inputYarnSiteConfig);
|
handleFairSchedulerConfig(params, inputYarnSiteConfig);
|
||||||
|
|
||||||
this.clusterResource = getClusterResource(params);
|
this.clusterResource = getClusterResource(params);
|
||||||
|
this.convertPlacementRules = params.isConvertPlacementRules();
|
||||||
|
|
||||||
convert(inputYarnSiteConfig);
|
convert(inputYarnSiteConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,17 +314,20 @@ private void convertCapacitySchedulerXml(FairScheduler fs) {
|
|||||||
queueConverter.convertQueueHierarchy(rootQueue);
|
queueConverter.convertQueueHierarchy(rootQueue);
|
||||||
emitACLs(fs);
|
emitACLs(fs);
|
||||||
|
|
||||||
|
if (convertPlacementRules) {
|
||||||
|
LOG.info("Converting placement rules");
|
||||||
PlacementManager placementManager =
|
PlacementManager placementManager =
|
||||||
fs.getRMContext().getQueuePlacementManager();
|
fs.getRMContext().getQueuePlacementManager();
|
||||||
|
|
||||||
if (placementManager.getPlacementRules().size() > 0) {
|
if (placementManager.getPlacementRules().size() > 0) {
|
||||||
QueuePlacementConverter placementConverter =
|
|
||||||
new QueuePlacementConverter();
|
|
||||||
Map<String, String> properties =
|
Map<String, String> properties =
|
||||||
placementConverter.convertPlacementPolicy(placementManager,
|
placementConverter.convertPlacementPolicy(placementManager,
|
||||||
ruleHandler, userAsDefaultQueue);
|
ruleHandler, userAsDefaultQueue);
|
||||||
properties.forEach((k, v) -> capacitySchedulerConfig.set(k, v));
|
properties.forEach((k, v) -> capacitySchedulerConfig.set(k, v));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
LOG.info("Ignoring the conversion of placement rules");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void emitDefaultMaxApplications() {
|
private void emitDefaultMaxApplications() {
|
||||||
@ -432,6 +440,15 @@ Configuration getYarnSiteConfig() {
|
|||||||
return convertedYarnSiteConfig;
|
return convertedYarnSiteConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setConvertPlacementRules(boolean convertPlacementRules) {
|
||||||
|
this.convertPlacementRules = convertPlacementRules;
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void setPlacementConverter(QueuePlacementConverter converter) {
|
||||||
|
this.placementConverter = converter;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Determines whether <queuePlacementPolicy> is present
|
* Determines whether <queuePlacementPolicy> is present
|
||||||
* in the allocation file or not.
|
* in the allocation file or not.
|
||||||
|
@ -27,6 +27,9 @@ public final class FSConfigToCSConfigConverterParams {
|
|||||||
private boolean console;
|
private boolean console;
|
||||||
private String clusterResource;
|
private String clusterResource;
|
||||||
private String outputDirectory;
|
private String outputDirectory;
|
||||||
|
private boolean convertPlacementRules;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private FSConfigToCSConfigConverterParams() {
|
private FSConfigToCSConfigConverterParams() {
|
||||||
//must use builder
|
//must use builder
|
||||||
@ -56,6 +59,10 @@ public String getOutputDirectory() {
|
|||||||
return outputDirectory;
|
return outputDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isConvertPlacementRules() {
|
||||||
|
return convertPlacementRules;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "FSConfigToCSConfigConverterParams{" +
|
return "FSConfigToCSConfigConverterParams{" +
|
||||||
@ -63,7 +70,8 @@ public String toString() {
|
|||||||
", fairSchedulerXmlConfig='" + fairSchedulerXmlConfig + '\'' +
|
", fairSchedulerXmlConfig='" + fairSchedulerXmlConfig + '\'' +
|
||||||
", conversionRulesConfig='" + conversionRulesConfig + '\'' +
|
", conversionRulesConfig='" + conversionRulesConfig + '\'' +
|
||||||
", clusterResource='" + clusterResource + '\'' +
|
", clusterResource='" + clusterResource + '\'' +
|
||||||
", console=" + console +
|
", console=" + console + '\'' +
|
||||||
|
", convertPlacementRules=" + convertPlacementRules +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,6 +86,7 @@ public static final class Builder {
|
|||||||
private boolean console;
|
private boolean console;
|
||||||
private String clusterResource;
|
private String clusterResource;
|
||||||
private String outputDirectory;
|
private String outputDirectory;
|
||||||
|
private boolean convertPlacementRules;
|
||||||
|
|
||||||
private Builder() {
|
private Builder() {
|
||||||
}
|
}
|
||||||
@ -116,6 +125,11 @@ public Builder withOutputDirectory(String outputDir) {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder withConvertPlacementRules(boolean convertPlacementRules) {
|
||||||
|
this.convertPlacementRules = convertPlacementRules;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public FSConfigToCSConfigConverterParams build() {
|
public FSConfigToCSConfigConverterParams build() {
|
||||||
FSConfigToCSConfigConverterParams params =
|
FSConfigToCSConfigConverterParams params =
|
||||||
new FSConfigToCSConfigConverterParams();
|
new FSConfigToCSConfigConverterParams();
|
||||||
@ -125,6 +139,7 @@ public FSConfigToCSConfigConverterParams build() {
|
|||||||
params.yarnSiteXmlConfig = this.yarnSiteXmlConfig;
|
params.yarnSiteXmlConfig = this.yarnSiteXmlConfig;
|
||||||
params.conversionRulesConfig = this.conversionRulesConfig;
|
params.conversionRulesConfig = this.conversionRulesConfig;
|
||||||
params.outputDirectory = this.outputDirectory;
|
params.outputDirectory = this.outputDirectory;
|
||||||
|
params.convertPlacementRules = this.convertPlacementRules;
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -555,4 +556,46 @@ public void testCapacitySchedulerXmlExistsInOutputFolder()
|
|||||||
testFileExistsInOutputFolder(
|
testFileExistsInOutputFolder(
|
||||||
YarnConfiguration.CS_CONFIGURATION_FILE);
|
YarnConfiguration.CS_CONFIGURATION_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPlacementRulesConversionEnabled() throws Exception {
|
||||||
|
testPlacementRuleConversion(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPlacementRulesConversionDisabled() throws Exception {
|
||||||
|
testPlacementRuleConversion(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testPlacementRuleConversion(boolean enabled) throws Exception {
|
||||||
|
setupFSConfigConversionFiles(true);
|
||||||
|
|
||||||
|
String[] args = null;
|
||||||
|
if (enabled) {
|
||||||
|
args = getArgumentsAsArrayWithDefaults("-f",
|
||||||
|
FSConfigConverterTestCommons.FS_ALLOC_FILE,
|
||||||
|
"-p", "-m");
|
||||||
|
} else {
|
||||||
|
args = getArgumentsAsArrayWithDefaults("-f",
|
||||||
|
FSConfigConverterTestCommons.FS_ALLOC_FILE,
|
||||||
|
"-p");
|
||||||
|
}
|
||||||
|
FSConfigToCSConfigArgumentHandler argumentHandler =
|
||||||
|
new FSConfigToCSConfigArgumentHandler(conversionOptions);
|
||||||
|
argumentHandler.setConverterSupplier(this::getMockConverter);
|
||||||
|
|
||||||
|
argumentHandler.parseAndConvert(args);
|
||||||
|
|
||||||
|
ArgumentCaptor<FSConfigToCSConfigConverterParams> captor =
|
||||||
|
ArgumentCaptor.forClass(FSConfigToCSConfigConverterParams.class);
|
||||||
|
verify(mockConverter).convert(captor.capture());
|
||||||
|
FSConfigToCSConfigConverterParams params = captor.getValue();
|
||||||
|
|
||||||
|
if (enabled) {
|
||||||
|
assertTrue("-m switch had no effect", params.isConvertPlacementRules());
|
||||||
|
} else {
|
||||||
|
assertFalse("Placement rule conversion was enabled",
|
||||||
|
params.isConvertPlacementRules());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -31,6 +31,9 @@
|
|||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
@ -43,6 +46,7 @@
|
|||||||
import org.apache.hadoop.service.ServiceStateException;
|
import org.apache.hadoop.service.ServiceStateException;
|
||||||
import org.apache.hadoop.yarn.api.records.Resource;
|
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.placement.PlacementManager;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration;
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration;
|
||||||
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerConfiguration;
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairSchedulerConfiguration;
|
||||||
import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator;
|
import org.apache.hadoop.yarn.util.resource.DominantResourceCalculator;
|
||||||
@ -86,6 +90,9 @@ public class TestFSConfigToCSConfigConverter {
|
|||||||
@Mock
|
@Mock
|
||||||
private DryRunResultHolder dryRunResultHolder;
|
private DryRunResultHolder dryRunResultHolder;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private QueuePlacementConverter placementConverter;
|
||||||
|
|
||||||
private FSConfigToCSConfigConverter converter;
|
private FSConfigToCSConfigConverter converter;
|
||||||
private Configuration config;
|
private Configuration config;
|
||||||
|
|
||||||
@ -583,6 +590,7 @@ private void testUserAsDefaultQueueWithoutPlacementRules(boolean
|
|||||||
config.setBoolean(FairSchedulerConfiguration.USER_AS_DEFAULT_QUEUE,
|
config.setBoolean(FairSchedulerConfiguration.USER_AS_DEFAULT_QUEUE,
|
||||||
userAsDefaultQueue);
|
userAsDefaultQueue);
|
||||||
|
|
||||||
|
converter.setConvertPlacementRules(true);
|
||||||
converter.convert(config);
|
converter.convert(config);
|
||||||
|
|
||||||
Configuration convertedConf = getConvertedCSConfig();
|
Configuration convertedConf = getConvertedCSConfig();
|
||||||
@ -650,6 +658,37 @@ private void testAutoCreateChildQueuesWithoutPlacementRules(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPlacementRulesConversionDisabled() throws Exception {
|
||||||
|
FSConfigToCSConfigConverterParams params = createDefaultParamsBuilder()
|
||||||
|
.withClusterResource(CLUSTER_RESOURCE_STRING)
|
||||||
|
.withFairSchedulerXmlConfig(FAIR_SCHEDULER_XML)
|
||||||
|
.withConvertPlacementRules(false)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
converter.setPlacementConverter(placementConverter);
|
||||||
|
converter.convert(params);
|
||||||
|
|
||||||
|
verifyZeroInteractions(placementConverter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPlacementRulesConversionEnabled() throws Exception {
|
||||||
|
FSConfigToCSConfigConverterParams params = createDefaultParamsBuilder()
|
||||||
|
.withClusterResource(CLUSTER_RESOURCE_STRING)
|
||||||
|
.withFairSchedulerXmlConfig(FAIR_SCHEDULER_XML)
|
||||||
|
.withConvertPlacementRules(true)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
converter.setPlacementConverter(placementConverter);
|
||||||
|
converter.convert(params);
|
||||||
|
|
||||||
|
verify(placementConverter).convertPlacementPolicy(
|
||||||
|
any(PlacementManager.class),
|
||||||
|
any(FSConfigToCSConfigRuleHandler.class),
|
||||||
|
any(Boolean.class));
|
||||||
|
}
|
||||||
|
|
||||||
private Configuration getConvertedCSConfig() {
|
private Configuration getConvertedCSConfig() {
|
||||||
ByteArrayInputStream input =
|
ByteArrayInputStream input =
|
||||||
new ByteArrayInputStream(csConfigOut.toByteArray());
|
new ByteArrayInputStream(csConfigOut.toByteArray());
|
||||||
|
Loading…
Reference in New Issue
Block a user