diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java index 6cdf9181fb3..12338fd1d06 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java @@ -556,7 +556,10 @@ private int printAMContainerLogs(Configuration conf, new ArrayList(); boolean getAMContainerLists = false; String appId = request.getAppId().toString(); - String errorMessage = ""; + StringBuilder errorMessage = new StringBuilder(); + // We will call RM webservice to get all AppAttempts information. + // If we get nothing, we will try to call AHS webservice to get AppAttempts + // which includes nodeAddress for the AM Containers. try { amContainersList = getAMContainerInfoForRMWebService(conf, appId); if (amContainersList != null && !amContainersList.isEmpty()) { @@ -573,21 +576,28 @@ private int printAMContainerLogs(Configuration conf, } } } catch (Exception ex) { - errorMessage = ex.getMessage(); + errorMessage.append(ex.getMessage() + "\n"); if (request.isAppFinished()) { - try { - amContainersList = getAMContainerInfoForAHSWebService(conf, appId); - if (amContainersList != null && !amContainersList.isEmpty()) { - getAMContainerLists = true; - for (JSONObject amContainer : amContainersList) { - ContainerLogsRequest amRequest = new ContainerLogsRequest( - request); - amRequest.setContainerId(amContainer.getString("amContainerId")); - requests.add(amRequest); + if (!conf.getBoolean(YarnConfiguration.TIMELINE_SERVICE_ENABLED, + YarnConfiguration.DEFAULT_TIMELINE_SERVICE_ENABLED)) { + errorMessage.append("Please enable the timeline service " + + "and make sure the timeline server is running."); + } else { + try { + amContainersList = getAMContainerInfoForAHSWebService(conf, appId); + if (amContainersList != null && !amContainersList.isEmpty()) { + getAMContainerLists = true; + for (JSONObject amContainer : amContainersList) { + ContainerLogsRequest amRequest = new ContainerLogsRequest( + request); + amRequest.setContainerId( + amContainer.getString("amContainerId")); + requests.add(amRequest); + } } + } catch (Exception e) { + errorMessage.append(e.getMessage()); } - } catch (Exception e) { - errorMessage = e.getMessage(); } } } @@ -596,6 +606,9 @@ private int printAMContainerLogs(Configuration conf, System.err.println("Unable to get AM container informations " + "for the application:" + appId); System.err.println(errorMessage); + System.err.println("Can not get AMContainers logs for " + + "the application:" + appId + " with the appOwner:" + + request.getAppOwner()); return -1; } @@ -636,19 +649,12 @@ private void outputAMContainerLogs(ContainerLogsRequest request, if (request.isAppFinished()) { if (containerId != null && !containerId.isEmpty()) { - if (nodeId == null || nodeId.isEmpty()) { - try { - nodeId = - getContainerReport(containerId).getAssignedNode().toString(); - request.setNodeId(nodeId); - } catch (Exception ex) { - System.err.println(ex); - nodeId = null; - } - } if (nodeId != null && !nodeId.isEmpty()) { printContainerLogsForFinishedApplication(request, logCliHelper); + } else { + printContainerLogsForFinishedApplicationWithoutNodeId( + request, logCliHelper); } } } else { @@ -826,39 +832,8 @@ private List parseAMContainer(CommandLine commandLine, private int fetchAMContainerLogs(ContainerLogsRequest request, List amContainersList, LogCLIHelpers logCliHelper) throws Exception { - - // If the application is running, we will call the RM WebService - // to get the AppAttempts which includes the nodeHttpAddress - // and containerId for all the AM Containers. - // After that, we will call NodeManager webService to get the - // related logs - if (!request.isAppFinished()) { - return printAMContainerLogs(getConf(), request, amContainersList, - logCliHelper); - } else { - // If the application is in the final state, we will call RM webservice - // to get all AppAttempts information first. If we get nothing, - // we will try to call AHS webservice to get related AppAttempts - // which includes nodeAddress for the AM Containers. - // After that, we will use nodeAddress and containerId - // to get logs from HDFS directly. - if (getConf().getBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED, - YarnConfiguration.DEFAULT_APPLICATION_HISTORY_ENABLED)) { - return printAMContainerLogs(getConf(), request, amContainersList, - logCliHelper); - } else { - ApplicationId appId = request.getAppId(); - String appOwner = request.getAppOwner(); - System.err.println("Can not get AMContainers logs for " - + "the application:" + appId + " with the appOwner:" + appOwner); - System.err.println("This application:" + appId + " has finished." - + " Please enable the application-history service or explicitly" - + " use 'yarn logs -applicationId " - + "-containerId --nodeAddress ' " - + "to get the container logs."); - return -1; - } - } + return printAMContainerLogs(getConf(), request, amContainersList, + logCliHelper); } private int fetchContainerLogs(ContainerLogsRequest request, @@ -869,13 +844,18 @@ private int fetchContainerLogs(ContainerLogsRequest request, String nodeAddress = request.getNodeId(); String appOwner = request.getAppOwner(); boolean isAppFinished = request.isAppFinished(); - // if we provide the node address and the application is in the final - // state, we could directly get logs from HDFS. - if (nodeAddress != null && isAppFinished) { + // if the application is in the final state, + // we could directly get logs from HDFS. + if (isAppFinished) { // if user specified "ALL" as the logFiles param, pass empty list // to logCliHelper so that it fetches all the logs - return printContainerLogsForFinishedApplication( - request, logCliHelper); + if (nodeAddress != null && !nodeAddress.isEmpty()) { + return printContainerLogsForFinishedApplication( + request, logCliHelper); + } else { + return printContainerLogsForFinishedApplicationWithoutNodeId( + request, logCliHelper); + } } String nodeHttpAddress = null; String nodeId = null;