e8d20ec081f5c1c88ff4b5c7e0f278951bba6a98 .../hadoop/yarn/client/cli/ApplicationCLI.java | 34 ++++++++++++++++ .../org/apache/hadoop/yarn/client/cli/YarnCLI.java | 1 + .../apache/hadoop/yarn/client/cli/TestYarnCLI.java | 47 ++++++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java index 1d26a96bb11..b699bc35c6d 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/ApplicationCLI.java @@ -199,6 +199,7 @@ public int run(String[] args) throws Exception { killOpt.setArgs(Option.UNLIMITED_VALUES); killOpt.setArgName("Application ID"); opts.addOption(killOpt); + opts.addOption(KILL_ALL_CMD, false, "Kills all applications in the cluster"); opts.getOption(MOVE_TO_QUEUE_CMD).setArgName("Application ID"); opts.getOption(QUEUE_CMD).setArgName("Queue Name"); opts.getOption(STATUS_CMD).setArgName("Application Name or ID"); @@ -438,6 +439,12 @@ public int run(String[] args) throws Exception { return exitCode; } return killApplication(cliParser.getOptionValues(KILL_CMD)); + } else if (cliParser.hasOption(KILL_ALL_CMD)) { + if (hasAnyOtherCLIOptions(cliParser, opts, KILL_ALL_CMD)) { + printUsage(title, opts); + return exitCode; + } + return killAllApplications(); } else if (cliParser.hasOption(MOVE_TO_QUEUE_CMD)) { if (!cliParser.hasOption(QUEUE_CMD)) { printUsage(title, opts); @@ -914,6 +921,33 @@ private int killApplication(String[] applicationIds) throws YarnException, return returnCode; } + + /** + * Kills all the applications in the cluster + * + * @throws YarnException + * @throws IOException + */ + private int killAllApplications() throws YarnException, + IOException { + int returnCode = -1; + EnumSet applicationStates = EnumSet.of( + YarnApplicationState.NEW, YarnApplicationState.NEW_SAVING, + YarnApplicationState.SUBMITTED, YarnApplicationState.ACCEPTED, + YarnApplicationState.RUNNING); + List apps = client.getApplications(applicationStates); + if(apps.size() == 0) { + sysout.println( + "No applications to kill"); + return returnCode; + } + for (ApplicationReport appReport : apps) { + String applicationId = appReport.getApplicationId().toString(); + killApplication(applicationId); + returnCode = 0; + } + return returnCode; + } /** * Kills the application with the application id as appId diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/YarnCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/YarnCLI.java index ac33deaf249..f5953a2cd22 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/YarnCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/YarnCLI.java @@ -33,6 +33,7 @@ public static final String STATUS_CMD = "status"; public static final String LIST_CMD = "list"; public static final String KILL_CMD = "kill"; + public static final String KILL_ALL_CMD = "killall"; public static final String FAIL_CMD = "fail"; public static final String MOVE_TO_QUEUE_CMD = "movetoqueue"; public static final String HELP_CMD = "help"; diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java index 353bff2063e..67df7924425 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/test/java/org/apache/hadoop/yarn/client/cli/TestYarnCLI.java @@ -36,6 +36,7 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.EnumSet; @@ -1143,6 +1144,52 @@ public void testKillApplications() throws Exception { Assert.assertEquals(createApplicationCLIHelpMessage(), sysOutStream.toString()); } + + @Test + public void testKillAllApplications() throws Exception { + ApplicationCLI cli = createAndGetAppCLI(); + ApplicationId applicationId1 = ApplicationId.newInstance(1234, 5); + ApplicationId applicationId2 = ApplicationId.newInstance(1234, 6); + EnumSet applicationStates = EnumSet.of( + YarnApplicationState.NEW, YarnApplicationState.NEW_SAVING, + YarnApplicationState.SUBMITTED, YarnApplicationState.ACCEPTED, + YarnApplicationState.RUNNING); + + // Test Scenario 1: Both applications are FINISHED. + when(client.getApplications(applicationStates)).thenReturn(Collections.emptyList()); + int result = cli.run(new String[]{"application", "-killall"}); + assertEquals(-1, result); + verify(client, times(0)).killApplication(applicationId1); + verify(client, times(0)).killApplication(applicationId2); + verify(sysOut).println( + "No applications to kill"); + + // Test Scenario 2: Both applications are RUNNING. + ApplicationReport newApplicationReport3 = ApplicationReport.newInstance( + applicationId1, ApplicationAttemptId.newInstance(applicationId1, 1), + "user", "queue", "appname", "host", 124, null, + YarnApplicationState.RUNNING, "diagnostics", "url", 0, 0, + FinalApplicationStatus.SUCCEEDED, null, "N/A", 0.53789f, "YARN", null); + ApplicationReport newApplicationReport4 = ApplicationReport.newInstance( + applicationId2, ApplicationAttemptId.newInstance(applicationId2, 1), + "user", "queue", "appname", "host", 124, null, + YarnApplicationState.RUNNING, "diagnostics", "url", 0, 0, + FinalApplicationStatus.SUCCEEDED, null, "N/A", 0.53345f, "YARN", null); + when(client.getApplicationReport(applicationId1)).thenReturn( + newApplicationReport3); + when(client.getApplicationReport(applicationId2)).thenReturn( + newApplicationReport4); + List appReports = Arrays.asList(newApplicationReport3, newApplicationReport4); + when(client.getApplications(applicationStates)).thenReturn(appReports); + result = cli.run(new String[]{"application", "-killall"}); + assertEquals(0, result); + verify(client).killApplication(applicationId1); + verify(client).killApplication(applicationId2); + verify(sysOut).println( + "Killing application application_1234_0005"); + verify(sysOut).println( + "Killing application application_1234_0006"); + } @Test public void testKillApplicationsOfDifferentEndStates() throws Exception {