diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 7adf2257db9..d3ae74c1150 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -38,6 +38,9 @@ Release 2.0.3-alpha - Unreleased YARN-33. Change LocalDirsHandlerService to validate the configured local and log dirs. (Mayank Bansal via sseth) + YARN-94. Modify DistributedShell to point to main-class by default, clean up + the help message, and hard-code the AM class. (Hitesh Shah via vinodkv) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml index 08d6b898000..2cc0fd152bc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/pom.xml @@ -82,6 +82,13 @@ test-compile + + + + org.apache.hadoop.yarn.applications.distributedshell.Client + + + maven-dependency-plugin diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/Client.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/Client.java index 3a4a51591a3..4a11cd02fcc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/Client.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/main/java/org/apache/hadoop/yarn/applications/distributedshell/Client.java @@ -119,7 +119,8 @@ public class Client extends YarnClientImpl { // Application master jar file private String appMasterJar = ""; // Main class to invoke application master - private String appMasterMainClass = ""; + private final String appMasterMainClass = + "org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster"; // Shell command to be executed private String shellCommand = ""; @@ -149,6 +150,9 @@ public class Client extends YarnClientImpl { // Debug flag boolean debugFlag = false; + // Command line options + private Options opts; + /** * @param args Command line arguments */ @@ -157,9 +161,15 @@ public class Client extends YarnClientImpl { try { Client client = new Client(); LOG.info("Initializing Client"); - boolean doRun = client.init(args); - if (!doRun) { - System.exit(0); + try { + boolean doRun = client.init(args); + if (!doRun) { + System.exit(0); + } + } catch (IllegalArgumentException e) { + System.err.println(e.getLocalizedMessage()); + client.printUsage(); + System.exit(-1); } result = client.run(); } catch (Throwable t) { @@ -180,6 +190,23 @@ public class Client extends YarnClientImpl { super(); this.conf = conf; init(conf); + opts = new Options(); + opts.addOption("appname", true, "Application Name. Default value - DistributedShell"); + opts.addOption("priority", true, "Application Priority. Default 0"); + opts.addOption("queue", true, "RM Queue in which this application is to be submitted"); + 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("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_script", true, "Location of the shell script to be executed"); + opts.addOption("shell_args", true, "Command line args for the shell script"); + 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("container_memory", true, "Amount of memory in MB 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("log_properties", true, "log4j.properties file"); + opts.addOption("debug", false, "Dump out debug information"); + opts.addOption("help", false, "Print usage"); } /** @@ -192,7 +219,7 @@ public class Client extends YarnClientImpl { * Helper function to print out usage * @param opts Parsed command line options */ - private void printUsage(Options opts) { + private void printUsage() { new HelpFormatter().printHelp("Client", opts); } @@ -204,33 +231,14 @@ public class Client extends YarnClientImpl { */ public boolean init(String[] args) throws ParseException { - Options opts = new Options(); - opts.addOption("appname", true, "Application Name. Default value - DistributedShell"); - opts.addOption("priority", true, "Application Priority. Default 0"); - opts.addOption("queue", true, "RM Queue in which this application is to be submitted"); - 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("jar", true, "Jar file containing the application master"); - opts.addOption("class", true, "Main class to be run for 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_args", true, "Command line args for the shell script"); - 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("container_memory", true, "Amount of memory in MB 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("log_properties", true, "log4j.properties file"); - opts.addOption("debug", false, "Dump out debug information"); - opts.addOption("help", false, "Print usage"); CommandLine cliParser = new GnuParser().parse(opts, args); if (args.length == 0) { - printUsage(opts); throw new IllegalArgumentException("No args specified for client to initialize"); } if (cliParser.hasOption("help")) { - printUsage(opts); + printUsage(); return false; } @@ -254,8 +262,6 @@ public class Client extends YarnClientImpl { } appMasterJar = cliParser.getOptionValue("jar"); - appMasterMainClass = cliParser.getOptionValue("class", - "org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster"); if (!cliParser.hasOption("shell_command")) { throw new IllegalArgumentException("No shell command specified to be executed by application master"); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/test/java/org/apache/hadoop/yarn/applications/distributedshell/TestDistributedShell.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/test/java/org/apache/hadoop/yarn/applications/distributedshell/TestDistributedShell.java index 29a053b65cb..08381786928 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/test/java/org/apache/hadoop/yarn/applications/distributedshell/TestDistributedShell.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-applications-distributedshell/src/test/java/org/apache/hadoop/yarn/applications/distributedshell/TestDistributedShell.java @@ -110,6 +110,22 @@ public class TestDistributedShell { } + @Test + public void testDSShellWithNoArgs() throws Exception { + + String[] args = {}; + + LOG.info("Initializing DS Client with no args"); + Client client = new Client(new Configuration(yarnCluster.getConfig())); + boolean exceptionThrown = false; + try { + boolean initSuccess = client.init(args); + } + catch (IllegalArgumentException e) { + exceptionThrown = true; + } + Assert.assertTrue(exceptionThrown); + } }