Browse Source

MAPREDUCE-5568. Fixed CompletedJob in JHS to show progress percentage correctly in case the number of mappers or reducers is zero. Contributed by MinJi Kim
(cherry picked from commit 78f7cdbfd6e2b9fac51c369c748ae93d12ef065a)

Jian He 10 years ago
parent
commit
80e9be2d95

+ 4 - 0
hadoop-mapreduce-project/CHANGES.txt

@@ -23,6 +23,10 @@ Release 2.7.0 - UNRELEASED
 
 
     MAPREDUCE-6049. AM JVM does not exit if MRClientService graceful shutdown
     MAPREDUCE-6049. AM JVM does not exit if MRClientService graceful shutdown
     fails (Rohith via devaraj)
     fails (Rohith via devaraj)
+
+    MAPREDUCE-5568. Fixed CompletedJob in JHS to show progress percentage
+    correctly in case the number of mappers or reducers is zero. (MinJi Kim via
+    jianhe)
  
  
 Release 2.6.0 - 2014-11-18
 Release 2.6.0 - 2014-11-18
 
 

+ 12 - 2
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/main/java/org/apache/hadoop/mapreduce/v2/hs/CompletedJob.java

@@ -141,8 +141,18 @@ public class CompletedJob implements org.apache.hadoop.mapreduce.v2.app.job.Job
     report.setFinishTime(jobInfo.getFinishTime());
     report.setFinishTime(jobInfo.getFinishTime());
     report.setJobName(jobInfo.getJobname());
     report.setJobName(jobInfo.getJobname());
     report.setUser(jobInfo.getUsername());
     report.setUser(jobInfo.getUsername());
-    report.setMapProgress((float) getCompletedMaps() / getTotalMaps());
-    report.setReduceProgress((float) getCompletedReduces() / getTotalReduces());
+
+    if ( getTotalMaps() == 0 ) {
+      report.setMapProgress(1.0f);
+    } else {
+      report.setMapProgress((float) getCompletedMaps() / getTotalMaps());
+    }
+    if ( getTotalReduces() == 0 ) {
+      report.setReduceProgress(1.0f);
+    } else {
+      report.setReduceProgress((float) getCompletedReduces() / getTotalReduces());
+    }
+
     report.setJobFile(getConfFile().toString());
     report.setJobFile(getConfFile().toString());
     String historyUrl = "N/A";
     String historyUrl = "N/A";
     try {
     try {

+ 25 - 5
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/java/org/apache/hadoop/mapreduce/v2/hs/TestJobHistoryEntities.java

@@ -55,14 +55,19 @@ public class TestJobHistoryEntities {
 
 
   private final String historyFileName =
   private final String historyFileName =
       "job_1329348432655_0001-1329348443227-user-Sleep+job-1329348468601-10-1-SUCCEEDED-default.jhist";
       "job_1329348432655_0001-1329348443227-user-Sleep+job-1329348468601-10-1-SUCCEEDED-default.jhist";
+  private final String historyFileNameZeroReduceTasks =
+    "job_1416424547277_0002-1416424775281-root-TeraGen-1416424785433-2-0-SUCCEEDED-default-1416424779349.jhist";
   private final String confFileName = "job_1329348432655_0001_conf.xml";
   private final String confFileName = "job_1329348432655_0001_conf.xml";
   private final Configuration conf = new Configuration();
   private final Configuration conf = new Configuration();
   private final JobACLsManager jobAclsManager = new JobACLsManager(conf);
   private final JobACLsManager jobAclsManager = new JobACLsManager(conf);
   private boolean loadTasks;
   private boolean loadTasks;
   private JobId jobId = MRBuilderUtils.newJobId(1329348432655l, 1, 1);
   private JobId jobId = MRBuilderUtils.newJobId(1329348432655l, 1, 1);
-  Path fulleHistoryPath =
+  Path fullHistoryPath =
     new Path(this.getClass().getClassLoader().getResource(historyFileName)
     new Path(this.getClass().getClassLoader().getResource(historyFileName)
         .getFile());
         .getFile());
+  Path fullHistoryPathZeroReduces =
+    new Path(this.getClass().getClassLoader().getResource(historyFileNameZeroReduceTasks)
+        .getFile());
   Path fullConfPath =
   Path fullConfPath =
     new Path(this.getClass().getClassLoader().getResource(confFileName)
     new Path(this.getClass().getClassLoader().getResource(confFileName)
         .getFile());
         .getFile());
@@ -87,7 +92,7 @@ public class TestJobHistoryEntities {
     when(info.getConfFile()).thenReturn(fullConfPath);
     when(info.getConfFile()).thenReturn(fullConfPath);
     //Re-initialize to verify the delayed load.
     //Re-initialize to verify the delayed load.
     completedJob =
     completedJob =
-      new CompletedJob(conf, jobId, fulleHistoryPath, loadTasks, "user",
+      new CompletedJob(conf, jobId, fullHistoryPath, loadTasks, "user",
           info, jobAclsManager);
           info, jobAclsManager);
     //Verify tasks loaded based on loadTask parameter.
     //Verify tasks loaded based on loadTask parameter.
     assertEquals(loadTasks, completedJob.tasksLoaded.get());
     assertEquals(loadTasks, completedJob.tasksLoaded.get());
@@ -106,12 +111,27 @@ public class TestJobHistoryEntities {
     assertEquals(JobState.SUCCEEDED, jobReport.getJobState());
     assertEquals(JobState.SUCCEEDED, jobReport.getJobState());
   }
   }
   
   
+  @Test (timeout=100000)
+  public void testCopmletedJobReportWithZeroTasks() throws Exception {
+    HistoryFileInfo info = mock(HistoryFileInfo.class);
+    when(info.getConfFile()).thenReturn(fullConfPath);
+    completedJob =
+      new CompletedJob(conf, jobId, fullHistoryPathZeroReduces, loadTasks, "user",
+          info, jobAclsManager);
+    JobReport jobReport = completedJob.getReport();
+    // Make sure that the number reduces (completed and total) are equal to zero.
+    assertEquals(0, completedJob.getTotalReduces());
+    assertEquals(0, completedJob.getCompletedReduces());
+    // Verify that the reduce progress is 1.0 (not NaN)
+    assertEquals(1.0, jobReport.getReduceProgress(), 0.001);
+  }
+
   @Test (timeout=10000)
   @Test (timeout=10000)
   public void testCompletedTask() throws Exception {
   public void testCompletedTask() throws Exception {
     HistoryFileInfo info = mock(HistoryFileInfo.class);
     HistoryFileInfo info = mock(HistoryFileInfo.class);
     when(info.getConfFile()).thenReturn(fullConfPath);
     when(info.getConfFile()).thenReturn(fullConfPath);
     completedJob =
     completedJob =
-      new CompletedJob(conf, jobId, fulleHistoryPath, loadTasks, "user",
+      new CompletedJob(conf, jobId, fullHistoryPath, loadTasks, "user",
           info, jobAclsManager);
           info, jobAclsManager);
     TaskId mt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.MAP);
     TaskId mt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.MAP);
     TaskId rt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.REDUCE);
     TaskId rt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.REDUCE);
@@ -140,7 +160,7 @@ public class TestJobHistoryEntities {
     HistoryFileInfo info = mock(HistoryFileInfo.class);
     HistoryFileInfo info = mock(HistoryFileInfo.class);
     when(info.getConfFile()).thenReturn(fullConfPath);
     when(info.getConfFile()).thenReturn(fullConfPath);
     completedJob =
     completedJob =
-      new CompletedJob(conf, jobId, fulleHistoryPath, loadTasks, "user",
+      new CompletedJob(conf, jobId, fullHistoryPath, loadTasks, "user",
           info, jobAclsManager);
           info, jobAclsManager);
     TaskId mt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.MAP);
     TaskId mt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.MAP);
     TaskId rt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.REDUCE);
     TaskId rt1Id = MRBuilderUtils.newTaskId(jobId, 0, TaskType.REDUCE);
@@ -179,7 +199,7 @@ public class TestJobHistoryEntities {
     HistoryFileInfo info = mock(HistoryFileInfo.class);
     HistoryFileInfo info = mock(HistoryFileInfo.class);
     when(info.getConfFile()).thenReturn(fullConfPath);
     when(info.getConfFile()).thenReturn(fullConfPath);
     completedJob =
     completedJob =
-      new CompletedJob(conf, jobId, fulleHistoryPath, loadTasks, "user",
+      new CompletedJob(conf, jobId, fullHistoryPath, loadTasks, "user",
           info, jobAclsManager);
           info, jobAclsManager);
     TaskCompletionEvent[] events= completedJob.getMapAttemptCompletionEvents(0,1000);
     TaskCompletionEvent[] events= completedJob.getMapAttemptCompletionEvents(0,1000);
     assertEquals(10, completedJob.getMapAttemptCompletionEvents(0,10).length);
     assertEquals(10, completedJob.getMapAttemptCompletionEvents(0,10).length);

File diff suppressed because it is too large
+ 1 - 0
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-hs/src/test/resources/job_1416424547277_0002-1416424775281-root-TeraGen-1416424785433-2-0-SUCCEEDED-default-1416424779349.jhist


Some files were not shown because too many files changed in this diff