diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapred/YarnChild.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapred/YarnChild.java index bbf527ebff53a..d43409c64e653 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapred/YarnChild.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/main/java/org/apache/hadoop/mapred/YarnChild.java @@ -246,6 +246,11 @@ static void reportError(Exception exception, Task task, LOG.error( "Fast fail the job because the cluster storage capacity was exceeded."); fastFailJob = true; + } else { + LOG.warn( + "The cluster storage capacity was exceeded, but fast fail is disabled. " + + "Set {} to true to enable fast fail.", + MRJobConfig.JOB_DFS_STORAGE_CAPACITY_KILL_LIMIT_EXCEED); } } umbilical.fatalError(taskid, StringUtils.stringifyException(exception), diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapred/TestYarnChild.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapred/TestYarnChild.java index 7730dc6c0615b..f3552e91c8632 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapred/TestYarnChild.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app/src/test/java/org/apache/hadoop/mapred/TestYarnChild.java @@ -21,8 +21,10 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.ClusterStorageCapacityExceededException; +import org.apache.hadoop.test.GenericTestUtils.LogCapturer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString; @@ -30,6 +32,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * Tests the behavior of YarnChild. @@ -91,7 +94,8 @@ public void testReportErrorWhenCapacityExceptionHappenAndFastFailDisabled() new RuntimeException(new ClusterStorageCapacityExceededException()); conf.setBoolean(KILL_LIMIT_EXCEED_CONF_NAME, false); - verifyReportError(exception, false); + verifyReportError(exception, false, + "The cluster storage capacity was exceeded, but fast fail is disabled."); } @Test @@ -120,4 +124,23 @@ private void verifyReportError(Exception exception, boolean fastFail) verify(umbilical).fatalError(any(), anyString(), eq(fastFail)); } + + private void verifyReportError(Exception exception, boolean fastFail, + String expectedLogMessage) throws IOException { + LogCapturer logCapturer = LogCapturer.captureLogs( + LoggerFactory.getLogger(YarnChild.class)); + try { + verifyReportError(exception, fastFail); + assertTrue(logCapturer.getOutput().contains(expectedLogMessage)); + if (fastFail) { + assertTrue(logCapturer.getOutput().contains( + "Fast fail the job because the cluster storage capacity was exceeded.")); + } else { + assertTrue(logCapturer.getOutput().contains( + KILL_LIMIT_EXCEED_CONF_NAME)); + } + } finally { + logCapturer.stopCapturing(); + } + } }