diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/CompletedJob.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/CompletedJob.java index ad4e6bc67c9..4deb9ae2f0d 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/CompletedJob.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/CompletedJob.java @@ -142,6 +142,7 @@ public class CompletedJob implements org.apache.hadoop.mapreduce.v2.app.job.Job report.setFinishTime(jobInfo.getFinishTime()); report.setJobName(jobInfo.getJobname()); report.setUser(jobInfo.getUsername()); + report.setDiagnostics(jobInfo.getErrorInfo()); if ( getTotalMaps() == 0 ) { report.setMapProgress(1.0f); @@ -335,6 +336,12 @@ public class CompletedJob implements org.apache.hadoop.mapreduce.v2.app.job.Job } } + protected JobHistoryParser createJobHistoryParser(Path historyFileAbsolute) + throws IOException { + return new JobHistoryParser(historyFileAbsolute.getFileSystem(conf), + historyFileAbsolute); + } + //History data is leisurely loaded when task level data is requested protected synchronized void loadFullHistoryData(boolean loadTasks, Path historyFileAbsolute) throws IOException { @@ -347,7 +354,7 @@ public class CompletedJob implements org.apache.hadoop.mapreduce.v2.app.job.Job JobHistoryParser parser = null; try { final FileSystem fs = historyFileAbsolute.getFileSystem(conf); - parser = new JobHistoryParser(fs, historyFileAbsolute); + parser = createJobHistoryParser(historyFileAbsolute); final Path jobConfPath = new Path(historyFileAbsolute.getParent(), JobHistoryUtils.getIntermediateConfFileName(jobId)); final Configuration conf = new Configuration(); diff --git a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestJobHistoryEntities.java b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestJobHistoryEntities.java index 8c7d8a0a1de..d30336d5b9b 100644 --- a/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestJobHistoryEntities.java +++ b/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestJobHistoryEntities.java @@ -19,8 +19,10 @@ package org.apache.hadoop.mapreduce.v2.hs; import static org.junit.Assert.assertEquals; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -28,6 +30,8 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.mapred.JobACLsManager; import org.apache.hadoop.mapred.TaskCompletionEvent; +import org.apache.hadoop.mapreduce.jobhistory.JobHistoryParser; +import org.apache.hadoop.mapreduce.jobhistory.JobHistoryParser.JobInfo; import org.apache.hadoop.mapreduce.v2.api.records.JobId; import org.apache.hadoop.mapreduce.v2.api.records.JobReport; import org.apache.hadoop.mapreduce.v2.api.records.JobState; @@ -236,4 +240,27 @@ public class TestJobHistoryEntities { } + @Test (timeout=30000) + public void testCompletedJobWithDiagnostics() throws Exception { + final String jobError = "Job Diagnostics"; + JobInfo jobInfo = spy(new JobInfo()); + when(jobInfo.getErrorInfo()).thenReturn(jobError); + when(jobInfo.getJobStatus()).thenReturn(JobState.FAILED.toString()); + when(jobInfo.getAMInfos()).thenReturn(Collections.emptyList()); + final JobHistoryParser mockParser = mock(JobHistoryParser.class); + when(mockParser.parse()).thenReturn(jobInfo); + HistoryFileInfo info = mock(HistoryFileInfo.class); + when(info.getConfFile()).thenReturn(fullConfPath); + when(info.getHistoryFile()).thenReturn(fullHistoryPath); + CompletedJob job = + new CompletedJob(conf, jobId, fullHistoryPath, loadTasks, "user", + info, jobAclsManager) { + @Override + protected JobHistoryParser createJobHistoryParser( + Path historyFileAbsolute) throws IOException { + return mockParser; + } + }; + assertEquals(jobError, job.getReport().getDiagnostics()); + } }