YARN-7. Support CPU resource for DistributedShell. (Junping Du via llu)
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1531222 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
0387ec792f
commit
735d8b27f7
|
@ -34,6 +34,8 @@ Release 2.3.0 - UNRELEASED
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
|
|
||||||
|
YARN-7. Support CPU resource for DistributedShell. (Junping Du via llu)
|
||||||
|
|
||||||
YARN-905. Add state filters to nodes CLI (Wei Yan via Sandy Ryza)
|
YARN-905. Add state filters to nodes CLI (Wei Yan via Sandy Ryza)
|
||||||
|
|
||||||
YARN-1098. Separate out RM services into Always On and Active (Karthik
|
YARN-1098. Separate out RM services into Always On and Active (Karthik
|
||||||
|
|
|
@ -180,6 +180,8 @@ public class ApplicationMaster {
|
||||||
private int numTotalContainers = 1;
|
private int numTotalContainers = 1;
|
||||||
// Memory to request for the container on which the shell command will run
|
// Memory to request for the container on which the shell command will run
|
||||||
private int containerMemory = 10;
|
private int containerMemory = 10;
|
||||||
|
// VirtualCores to request for the container on which the shell command will run
|
||||||
|
private int containerVirtualCores = 1;
|
||||||
// Priority of the request
|
// Priority of the request
|
||||||
private int requestPriority;
|
private int requestPriority;
|
||||||
|
|
||||||
|
@ -309,6 +311,8 @@ public class ApplicationMaster {
|
||||||
"Environment for shell script. Specified as env_key=env_val pairs");
|
"Environment for shell script. Specified as env_key=env_val pairs");
|
||||||
opts.addOption("container_memory", true,
|
opts.addOption("container_memory", true,
|
||||||
"Amount of memory in MB to be requested to run the shell command");
|
"Amount of memory in MB to be requested to run the shell command");
|
||||||
|
opts.addOption("container_vcores", true,
|
||||||
|
"Amount of virtual cores to be requested to run the shell command");
|
||||||
opts.addOption("num_containers", true,
|
opts.addOption("num_containers", true,
|
||||||
"No. of containers on which the shell command needs to be executed");
|
"No. of containers on which the shell command needs to be executed");
|
||||||
opts.addOption("priority", true, "Application Priority. Default 0");
|
opts.addOption("priority", true, "Application Priority. Default 0");
|
||||||
|
@ -421,6 +425,8 @@ public class ApplicationMaster {
|
||||||
|
|
||||||
containerMemory = Integer.parseInt(cliParser.getOptionValue(
|
containerMemory = Integer.parseInt(cliParser.getOptionValue(
|
||||||
"container_memory", "10"));
|
"container_memory", "10"));
|
||||||
|
containerVirtualCores = Integer.parseInt(cliParser.getOptionValue(
|
||||||
|
"container_vcores", "1"));
|
||||||
numTotalContainers = Integer.parseInt(cliParser.getOptionValue(
|
numTotalContainers = Integer.parseInt(cliParser.getOptionValue(
|
||||||
"num_containers", "1"));
|
"num_containers", "1"));
|
||||||
if (numTotalContainers == 0) {
|
if (numTotalContainers == 0) {
|
||||||
|
@ -493,6 +499,9 @@ public class ApplicationMaster {
|
||||||
int maxMem = response.getMaximumResourceCapability().getMemory();
|
int maxMem = response.getMaximumResourceCapability().getMemory();
|
||||||
LOG.info("Max mem capabililty of resources in this cluster " + maxMem);
|
LOG.info("Max mem capabililty of resources in this cluster " + maxMem);
|
||||||
|
|
||||||
|
int maxVCores = response.getMaximumResourceCapability().getVirtualCores();
|
||||||
|
LOG.info("Max vcores capabililty of resources in this cluster " + maxVCores);
|
||||||
|
|
||||||
// A resource ask cannot exceed the max.
|
// A resource ask cannot exceed the max.
|
||||||
if (containerMemory > maxMem) {
|
if (containerMemory > maxMem) {
|
||||||
LOG.info("Container memory specified above max threshold of cluster."
|
LOG.info("Container memory specified above max threshold of cluster."
|
||||||
|
@ -501,6 +510,13 @@ public class ApplicationMaster {
|
||||||
containerMemory = maxMem;
|
containerMemory = maxMem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (containerVirtualCores > maxVCores) {
|
||||||
|
LOG.info("Container virtual cores specified above max threshold of cluster."
|
||||||
|
+ " Using max value." + ", specified=" + containerVirtualCores + ", max="
|
||||||
|
+ maxVCores);
|
||||||
|
containerVirtualCores = maxVCores;
|
||||||
|
}
|
||||||
|
|
||||||
// Setup ask for containers from RM
|
// Setup ask for containers from RM
|
||||||
// Send request for containers to RM
|
// Send request for containers to RM
|
||||||
// Until we get our fully allocated quota, we keep on polling RM for
|
// Until we get our fully allocated quota, we keep on polling RM for
|
||||||
|
@ -645,7 +661,9 @@ public class ApplicationMaster {
|
||||||
+ ":" + allocatedContainer.getNodeId().getPort()
|
+ ":" + allocatedContainer.getNodeId().getPort()
|
||||||
+ ", containerNodeURI=" + allocatedContainer.getNodeHttpAddress()
|
+ ", containerNodeURI=" + allocatedContainer.getNodeHttpAddress()
|
||||||
+ ", containerResourceMemory"
|
+ ", containerResourceMemory"
|
||||||
+ allocatedContainer.getResource().getMemory());
|
+ allocatedContainer.getResource().getMemory()
|
||||||
|
+ ", containerResourceVirtualCores"
|
||||||
|
+ allocatedContainer.getResource().getVirtualCores());
|
||||||
// + ", containerToken"
|
// + ", containerToken"
|
||||||
// +allocatedContainer.getContainerToken().getIdentifier().toString());
|
// +allocatedContainer.getContainerToken().getIdentifier().toString());
|
||||||
|
|
||||||
|
@ -872,9 +890,10 @@ public class ApplicationMaster {
|
||||||
pri.setPriority(requestPriority);
|
pri.setPriority(requestPriority);
|
||||||
|
|
||||||
// Set up resource type requirements
|
// Set up resource type requirements
|
||||||
// For now, only memory is supported so we set memory requirements
|
// For now, memory and CPU are supported so we set memory and cpu requirements
|
||||||
Resource capability = Records.newRecord(Resource.class);
|
Resource capability = Records.newRecord(Resource.class);
|
||||||
capability.setMemory(containerMemory);
|
capability.setMemory(containerMemory);
|
||||||
|
capability.setVirtualCores(containerVirtualCores);
|
||||||
|
|
||||||
ContainerRequest request = new ContainerRequest(capability, null, null,
|
ContainerRequest request = new ContainerRequest(capability, null, null,
|
||||||
pri);
|
pri);
|
||||||
|
|
|
@ -121,6 +121,8 @@ public class Client {
|
||||||
private String amQueue = "";
|
private String amQueue = "";
|
||||||
// Amt. of memory resource to request for to run the App Master
|
// Amt. of memory resource to request for to run the App Master
|
||||||
private int amMemory = 10;
|
private int amMemory = 10;
|
||||||
|
// Amt. of virtual core resource to request for to run the App Master
|
||||||
|
private int amVCores = 1;
|
||||||
|
|
||||||
// Application master jar file
|
// Application master jar file
|
||||||
private String appMasterJar = "";
|
private String appMasterJar = "";
|
||||||
|
@ -140,6 +142,8 @@ public class Client {
|
||||||
|
|
||||||
// Amt of memory to request for container in which shell script will be executed
|
// Amt of memory to request for container in which shell script will be executed
|
||||||
private int containerMemory = 10;
|
private int containerMemory = 10;
|
||||||
|
// Amt. of virtual cores to request for container in which shell script will be executed
|
||||||
|
private int containerVirtualCores = 1;
|
||||||
// No. of containers in which the shell script needs to be executed
|
// No. of containers in which the shell script needs to be executed
|
||||||
private int numContainers = 1;
|
private int numContainers = 1;
|
||||||
|
|
||||||
|
@ -208,6 +212,7 @@ public class Client {
|
||||||
opts.addOption("queue", true, "RM Queue in which this application is to be submitted");
|
opts.addOption("queue", true, "RM Queue in which this application is to be submitted");
|
||||||
opts.addOption("timeout", true, "Application timeout in milliseconds");
|
opts.addOption("timeout", true, "Application timeout in milliseconds");
|
||||||
opts.addOption("master_memory", true, "Amount of memory in MB to be requested to run the application master");
|
opts.addOption("master_memory", true, "Amount of memory in MB to be requested to run the application master");
|
||||||
|
opts.addOption("master_vcores", true, "Amount of virtual cores to be requested to run the application master");
|
||||||
opts.addOption("jar", true, "Jar file containing the application master");
|
opts.addOption("jar", true, "Jar file containing the application master");
|
||||||
opts.addOption("shell_command", true, "Shell command to be executed by the Application Master");
|
opts.addOption("shell_command", true, "Shell command to be executed by the Application Master");
|
||||||
opts.addOption("shell_script", true, "Location of the shell script to be executed");
|
opts.addOption("shell_script", true, "Location of the shell script to be executed");
|
||||||
|
@ -215,6 +220,7 @@ public class Client {
|
||||||
opts.addOption("shell_env", true, "Environment for shell script. Specified as env_key=env_val pairs");
|
opts.addOption("shell_env", true, "Environment for shell script. Specified as env_key=env_val pairs");
|
||||||
opts.addOption("shell_cmd_priority", true, "Priority for the shell command containers");
|
opts.addOption("shell_cmd_priority", true, "Priority for the shell command containers");
|
||||||
opts.addOption("container_memory", true, "Amount of memory in MB to be requested to run the shell command");
|
opts.addOption("container_memory", true, "Amount of memory in MB to be requested to run the shell command");
|
||||||
|
opts.addOption("container_vcores", true, "Amount of virtual cores to be requested to run the shell command");
|
||||||
opts.addOption("num_containers", true, "No. of containers on which the shell command needs to be executed");
|
opts.addOption("num_containers", true, "No. of containers on which the shell command needs to be executed");
|
||||||
opts.addOption("log_properties", true, "log4j.properties file");
|
opts.addOption("log_properties", true, "log4j.properties file");
|
||||||
opts.addOption("debug", false, "Dump out debug information");
|
opts.addOption("debug", false, "Dump out debug information");
|
||||||
|
@ -263,11 +269,16 @@ public class Client {
|
||||||
amPriority = Integer.parseInt(cliParser.getOptionValue("priority", "0"));
|
amPriority = Integer.parseInt(cliParser.getOptionValue("priority", "0"));
|
||||||
amQueue = cliParser.getOptionValue("queue", "default");
|
amQueue = cliParser.getOptionValue("queue", "default");
|
||||||
amMemory = Integer.parseInt(cliParser.getOptionValue("master_memory", "10"));
|
amMemory = Integer.parseInt(cliParser.getOptionValue("master_memory", "10"));
|
||||||
|
amVCores = Integer.parseInt(cliParser.getOptionValue("master_vcores", "1"));
|
||||||
|
|
||||||
if (amMemory < 0) {
|
if (amMemory < 0) {
|
||||||
throw new IllegalArgumentException("Invalid memory specified for application master, exiting."
|
throw new IllegalArgumentException("Invalid memory specified for application master, exiting."
|
||||||
+ " Specified memory=" + amMemory);
|
+ " Specified memory=" + amMemory);
|
||||||
}
|
}
|
||||||
|
if (amVCores < 0) {
|
||||||
|
throw new IllegalArgumentException("Invalid virtual cores specified for application master, exiting."
|
||||||
|
+ " Specified virtual cores=" + amVCores);
|
||||||
|
}
|
||||||
|
|
||||||
if (!cliParser.hasOption("jar")) {
|
if (!cliParser.hasOption("jar")) {
|
||||||
throw new IllegalArgumentException("No jar file specified for application master");
|
throw new IllegalArgumentException("No jar file specified for application master");
|
||||||
|
@ -306,11 +317,14 @@ public class Client {
|
||||||
shellCmdPriority = Integer.parseInt(cliParser.getOptionValue("shell_cmd_priority", "0"));
|
shellCmdPriority = Integer.parseInt(cliParser.getOptionValue("shell_cmd_priority", "0"));
|
||||||
|
|
||||||
containerMemory = Integer.parseInt(cliParser.getOptionValue("container_memory", "10"));
|
containerMemory = Integer.parseInt(cliParser.getOptionValue("container_memory", "10"));
|
||||||
|
containerVirtualCores = Integer.parseInt(cliParser.getOptionValue("container_vcores", "1"));
|
||||||
numContainers = Integer.parseInt(cliParser.getOptionValue("num_containers", "1"));
|
numContainers = Integer.parseInt(cliParser.getOptionValue("num_containers", "1"));
|
||||||
|
|
||||||
if (containerMemory < 0 || numContainers < 1) {
|
if (containerMemory < 0 || containerVirtualCores < 0 || numContainers < 1) {
|
||||||
throw new IllegalArgumentException("Invalid no. of containers or container memory specified, exiting."
|
throw new IllegalArgumentException("Invalid no. of containers or container memory/vcores specified,"
|
||||||
|
+ " exiting."
|
||||||
+ " Specified containerMemory=" + containerMemory
|
+ " Specified containerMemory=" + containerMemory
|
||||||
|
+ ", containerVirtualCores=" + containerVirtualCores
|
||||||
+ ", numContainer=" + numContainers);
|
+ ", numContainer=" + numContainers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,6 +397,16 @@ public class Client {
|
||||||
amMemory = maxMem;
|
amMemory = maxMem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int maxVCores = appResponse.getMaximumResourceCapability().getVirtualCores();
|
||||||
|
LOG.info("Max virtual cores capabililty of resources in this cluster " + maxVCores);
|
||||||
|
|
||||||
|
if (amVCores > maxVCores) {
|
||||||
|
LOG.info("AM virtual cores specified above max threshold of cluster. "
|
||||||
|
+ "Using max value." + ", specified=" + amVCores
|
||||||
|
+ ", max=" + maxVCores);
|
||||||
|
amVCores = maxVCores;
|
||||||
|
}
|
||||||
|
|
||||||
// set the application name
|
// set the application name
|
||||||
ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();
|
ApplicationSubmissionContext appContext = app.getApplicationSubmissionContext();
|
||||||
ApplicationId appId = appContext.getApplicationId();
|
ApplicationId appId = appContext.getApplicationId();
|
||||||
|
@ -514,6 +538,7 @@ public class Client {
|
||||||
vargs.add(appMasterMainClass);
|
vargs.add(appMasterMainClass);
|
||||||
// Set params for Application Master
|
// Set params for Application Master
|
||||||
vargs.add("--container_memory " + String.valueOf(containerMemory));
|
vargs.add("--container_memory " + String.valueOf(containerMemory));
|
||||||
|
vargs.add("--container_vcores " + String.valueOf(containerVirtualCores));
|
||||||
vargs.add("--num_containers " + String.valueOf(numContainers));
|
vargs.add("--num_containers " + String.valueOf(numContainers));
|
||||||
vargs.add("--priority " + String.valueOf(shellCmdPriority));
|
vargs.add("--priority " + String.valueOf(shellCmdPriority));
|
||||||
if (!shellCommand.isEmpty()) {
|
if (!shellCommand.isEmpty()) {
|
||||||
|
@ -544,9 +569,11 @@ public class Client {
|
||||||
amContainer.setCommands(commands);
|
amContainer.setCommands(commands);
|
||||||
|
|
||||||
// Set up resource type requirements
|
// Set up resource type requirements
|
||||||
// For now, only memory is supported so we set memory requirements
|
// For now, both memory and vcores are supported, so we set memory and
|
||||||
|
// vcores requirements
|
||||||
Resource capability = Records.newRecord(Resource.class);
|
Resource capability = Records.newRecord(Resource.class);
|
||||||
capability.setMemory(amMemory);
|
capability.setMemory(amMemory);
|
||||||
|
capability.setVirtualCores(amVCores);
|
||||||
appContext.setResource(capability);
|
appContext.setResource(capability);
|
||||||
|
|
||||||
// Service data is a binary blob that can be passed to the application
|
// Service data is a binary blob that can be passed to the application
|
||||||
|
|
|
@ -118,8 +118,12 @@ public class TestDistributedShell {
|
||||||
Shell.WINDOWS ? "dir" : "ls",
|
Shell.WINDOWS ? "dir" : "ls",
|
||||||
"--master_memory",
|
"--master_memory",
|
||||||
"512",
|
"512",
|
||||||
|
"--master_vcores",
|
||||||
|
"2",
|
||||||
"--container_memory",
|
"--container_memory",
|
||||||
"128"
|
"128",
|
||||||
|
"--container_vcores",
|
||||||
|
"1"
|
||||||
};
|
};
|
||||||
|
|
||||||
LOG.info("Initializing DS Client");
|
LOG.info("Initializing DS Client");
|
||||||
|
@ -237,6 +241,31 @@ public class TestDistributedShell {
|
||||||
Assert.assertTrue("The throw exception is not expected",
|
Assert.assertTrue("The throw exception is not expected",
|
||||||
e.getMessage().contains("Invalid no. of containers"));
|
e.getMessage().contains("Invalid no. of containers"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG.info("Initializing DS Client with invalid no. of vcores");
|
||||||
|
try {
|
||||||
|
String[] args = {
|
||||||
|
"--jar",
|
||||||
|
APPMASTER_JAR,
|
||||||
|
"--num_containers",
|
||||||
|
"2",
|
||||||
|
"--shell_command",
|
||||||
|
Shell.WINDOWS ? "dir" : "ls",
|
||||||
|
"--master_memory",
|
||||||
|
"512",
|
||||||
|
"--master_vcores",
|
||||||
|
"-2",
|
||||||
|
"--container_memory",
|
||||||
|
"128",
|
||||||
|
"--container_vcores",
|
||||||
|
"1"
|
||||||
|
};
|
||||||
|
client.init(args);
|
||||||
|
Assert.fail("Exception is expected");
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Assert.assertTrue("The throw exception is not expected",
|
||||||
|
e.getMessage().contains("Invalid virtual cores specified"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static void waitForNMToRegister(NodeManager nm)
|
protected static void waitForNMToRegister(NodeManager nm)
|
||||||
|
|
Loading…
Reference in New Issue