diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java index 000227a..52f090b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/RMAppAttemptImpl.java @@ -1294,12 +1294,20 @@ private void setAMContainerCrashedDiagnosticsAndExitStatus( private String getAMContainerCrashedDiagnostics( RMAppAttemptContainerFinishedEvent finishEvent) { ContainerStatus status = finishEvent.getContainerStatus(); - String diagnostics = - "AM Container for " + finishEvent.getApplicationAttemptId() - + " exited with " + " exitCode: " + status.getExitStatus() + ". " - + "Check application tracking page: " + this.getTrackingUrl() - + " . Then, click on links to logs of each attempt for detailed output. "; - return diagnostics; + StringBuilder diagnosticsBuilder = new StringBuilder(); + diagnosticsBuilder.append("AM Container for ").append( + finishEvent.getApplicationAttemptId()).append( + " exited with ").append(" exitCode: ").append(status.getExitStatus()). + append("\n"); + if (this.getTrackingUrl() != null) { + diagnosticsBuilder.append("For more detailed output,").append( + " check application tracking page:").append( + this.getTrackingUrl()).append( + "Then, click on links to logs of each attempt.\n"); + } + diagnosticsBuilder.append("Diagnostics: ").append(status.getDiagnostics()) + .append("Failing this attempt"); + return diagnosticsBuilder.toString(); } private static class FinalTransition extends BaseFinalTransition { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java index c99987d..91f2558 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/rmapp/attempt/TestRMAppAttemptTransitions.java @@ -820,7 +820,9 @@ public void testAMCrashAtAllocated() { applicationAttempt.getAppAttemptState()); verifyTokenCount(applicationAttempt.getAppAttemptId(), 1); verifyApplicationAttemptFinished(RMAppAttemptState.FAILED); - verifyAMCrashAtAllocatedDiagnosticInfo(applicationAttempt.getDiagnostics()); + boolean shouldCheckURL = (applicationAttempt.getTrackingUrl() == null); + verifyAMCrashAtAllocatedDiagnosticInfo(applicationAttempt.getDiagnostics(), + exitCode, shouldCheckURL); } @Test @@ -1238,11 +1240,18 @@ public void testContainersCleanupForLastAttempt() { verifyApplicationAttemptFinished(RMAppAttemptState.FAILED); } - private void verifyAMCrashAtAllocatedDiagnosticInfo(String diagnostics) { - assertTrue("Diagnostic information does not contain application proxy URL", - diagnostics.contains(applicationAttempt.getWebProxyBase())); + private void verifyAMCrashAtAllocatedDiagnosticInfo(String diagnostics, + int exitCode, boolean shouldCheckURL) { assertTrue("Diagnostic information does not point the logs to the users", diagnostics.contains("logs")); + assertTrue("Diagnostic information does not contain application attempt id", + diagnostics.contains(applicationAttempt.getAppAttemptId().toString())); + assertTrue("Diagnostic information does not contain application exit code", + diagnostics.contains("exitCode: " + exitCode)); + if (shouldCheckURL) { + assertTrue("Diagnostic information does not contain application proxy URL", + diagnostics.contains(applicationAttempt.getWebProxyBase())); + } } private void verifyTokenCount(ApplicationAttemptId appAttemptId, int count) {