diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java index d1ccc4f..bf46d15 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/client/ServiceClient.java @@ -898,7 +898,21 @@ public ServiceState convertState(YarnApplicationState state) { } } - public String getStatusString(String appId) + @Override + public String getStatusString(String appIdOrName) + throws IOException, YarnException { + try { + // try parsing appIdOrName, if it succeeds, it means it's appId + ApplicationId.fromString(appIdOrName); + return getStatusByAppId(appIdOrName); + } catch (IllegalArgumentException e) { + // not appId format, it could be appName. + Service status = getStatus(appIdOrName); + return status.toString(); + } + } + + private String getStatusByAppId(String appId) throws IOException, YarnException { ApplicationReport appReport = yarnClient.getApplicationReport(ApplicationId.fromString(appId)); @@ -909,8 +923,7 @@ public String getStatusString(String appId) if (StringUtils.isEmpty(appReport.getHost())) { return ""; } - ClientAMProtocol amProxy = - createAMProxy(appReport.getName(), appReport); + ClientAMProtocol amProxy = createAMProxy(appReport.getName(), appReport); GetStatusResponseProto response = amProxy.getStatus(GetStatusRequestProto.newBuilder().build()); return response.getStatus(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AppAdminClient.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AppAdminClient.java index 6310178..6aba91a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AppAdminClient.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/api/AppAdminClient.java @@ -207,16 +207,16 @@ public abstract int enableFastLaunch() throws IOException, /** *

- * Get detailed status string for a YARN application. + * Get detailed app specific status string for a YARN application. *

* - * @param applicationId application id + * @param appIdOrName appId or appName * @return status string * @throws IOException IOException * @throws YarnException exception in client or server */ @Public @Unstable - public abstract String getStatusString(String applicationId) throws + public abstract String getStatusString(String appIdOrName) throws IOException, YarnException; } 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 fb08fcd..478d652 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 @@ -289,28 +289,26 @@ public int run(String[] args) throws Exception { } if (cliParser.hasOption(STATUS_CMD)) { - if (hasAnyOtherCLIOptions(cliParser, opts, STATUS_CMD)) { + if (hasAnyOtherCLIOptions(cliParser, opts, STATUS_CMD, APP_TYPE_CMD)) { printUsage(title, opts); return exitCode; } if (title.equalsIgnoreCase(APPLICATION) || title.equalsIgnoreCase(APP)) { - ApplicationReport report = printApplicationReport(cliParser - .getOptionValue(STATUS_CMD)); - if (report == null) { - exitCode = -1; - } else { + String appIdOrName = cliParser.getOptionValue(STATUS_CMD); + try { + // try parsing appIdOrName, if it succeeds, it means it's appId + ApplicationId.fromString(appIdOrName); + exitCode = printApplicationReport(appIdOrName); + } catch (IllegalArgumentException e) { + // not appId format, it could be appName. + // Print app specific report, if app-type is not provided, + // assume it is yarn-service type. + AppAdminClient client = AppAdminClient + .createAppAdminClient(getSingleAppTypeFromCLI(cliParser), + getConf()); + sysout.println(client.getStatusString(appIdOrName)); exitCode = 0; - String appType = report.getApplicationType(); - try { - AppAdminClient client = AppAdminClient.createAppAdminClient(appType, - getConf()); - sysout.println("Detailed Application Status :"); - sysout.println(client.getStatusString(cliParser.getOptionValue( - STATUS_CMD))); - } catch (IllegalArgumentException e) { - // app type does not have app admin client implementation - } } } else if (title.equalsIgnoreCase(APPLICATION_ATTEMPT)) { exitCode = printApplicationAttemptReport(cliParser @@ -891,7 +889,7 @@ private void failApplicationAttempt(String attemptId) throws YarnException, * @return ApplicationReport * @throws YarnException */ - private ApplicationReport printApplicationReport(String applicationId) + private int printApplicationReport(String applicationId) throws YarnException, IOException { ApplicationReport appReport = null; try { @@ -900,7 +898,7 @@ private ApplicationReport printApplicationReport(String applicationId) } catch (ApplicationNotFoundException e) { sysout.println("Application with id '" + applicationId + "' doesn't exist in RM or Timeline Server."); - return null; + return -1; } // Use PrintWriter.println, which uses correct platform line ending. ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -964,11 +962,11 @@ private ApplicationReport printApplicationReport(String applicationId) + "' doesn't exist in RM."); appReportStr.close(); sysout.println(baos.toString("UTF-8")); - return null; + return -1; } appReportStr.close(); sysout.println(baos.toString("UTF-8")); - return appReport; + return 0; } private void printResourceUsage(PrintWriter appReportStr,