diff --git a/app/com/linkedin/drelephant/mapreduce/MapReduceMetricsAggregator.java b/app/com/linkedin/drelephant/mapreduce/MapReduceMetricsAggregator.java index 5d00dead6..ca29ad158 100644 --- a/app/com/linkedin/drelephant/mapreduce/MapReduceMetricsAggregator.java +++ b/app/com/linkedin/drelephant/mapreduce/MapReduceMetricsAggregator.java @@ -57,6 +57,12 @@ public void aggregate(HadoopApplicationData hadoopData) { long reduceIdealStartTime = mapTasks.getNthPercentileFinishTime(reduceTaskSlowStartPercentage); + // Mappers list is empty + if(reduceIdealStartTime == -1) { + // ideal start time for reducer is infinite since it cannot start + reduceIdealStartTime = Long.MAX_VALUE; + } + reduceTasks = new TaskLevelAggregatedMetrics(data.getReducerData(), reduceTaskContainerSize, reduceIdealStartTime); _hadoopAggregatedData.setResourceUsed(mapTasks.getResourceUsed() + reduceTasks.getResourceUsed()); diff --git a/app/com/linkedin/drelephant/mapreduce/TaskLevelAggregatedMetrics.java b/app/com/linkedin/drelephant/mapreduce/TaskLevelAggregatedMetrics.java index 2a18df679..f0a525943 100644 --- a/app/com/linkedin/drelephant/mapreduce/TaskLevelAggregatedMetrics.java +++ b/app/com/linkedin/drelephant/mapreduce/TaskLevelAggregatedMetrics.java @@ -46,6 +46,9 @@ public class TaskLevelAggregatedMetrics { */ public long getNthPercentileFinishTime(int percentile) { + if(finishTimes == null || finishTimes.size() == 0 ) { + return -1; + } return Statistics.percentile(finishTimes, percentile); } @@ -98,7 +101,7 @@ private void compute(MapReduceTaskData[] taskDatas, long containerSize, long ide long taskDurationMax = 0; // if there are zero tasks, then nothing to compute. - if(taskDatas.length == 0) { + if(taskDatas == null || taskDatas.length == 0) { return; } @@ -133,6 +136,11 @@ private void compute(MapReduceTaskData[] taskDatas, long containerSize, long ide // Compute the delay in starting the task. _delay = taskFinishTimeMax - (idealStartTime + taskDurationMax); + // invalid delay + if(_delay < 0) { + _delay = 0; + } + // wastedResources long wastedMemory = containerSize - (long) (peakMemoryNeed * MEMORY_BUFFER); // give a 50% buffer if(wastedMemory > 0) { diff --git a/public/images/runtime.png b/public/images/runtime.png index 68df97405..6f98430d9 100644 Binary files a/public/images/runtime.png and b/public/images/runtime.png differ diff --git a/public/images/usedmemory.png b/public/images/usedmemory.png index e637efc76..c55a084a6 100644 Binary files a/public/images/usedmemory.png and b/public/images/usedmemory.png differ diff --git a/public/images/waittime.png b/public/images/waittime.png index cfd494c3c..fb862f961 100644 Binary files a/public/images/waittime.png and b/public/images/waittime.png differ diff --git a/public/images/wastedmemory.png b/public/images/wastedmemory.png index 37e68b534..627bf8d9c 100644 Binary files a/public/images/wastedmemory.png and b/public/images/wastedmemory.png differ diff --git a/test/com/linkedin/drelephant/mapreduce/TestTaskLevelAggregatedMetrics.java b/test/com/linkedin/drelephant/mapreduce/TestTaskLevelAggregatedMetrics.java index 3163d732f..f5dd528c7 100644 --- a/test/com/linkedin/drelephant/mapreduce/TestTaskLevelAggregatedMetrics.java +++ b/test/com/linkedin/drelephant/mapreduce/TestTaskLevelAggregatedMetrics.java @@ -32,6 +32,14 @@ public void testZeroTasks() { Assert.assertEquals(taskMetrics.getResourceWasted(), 0); } + @Test + public void testNullTaskArray() { + TaskLevelAggregatedMetrics taskMetrics = new TaskLevelAggregatedMetrics(null, 0, 0); + Assert.assertEquals(taskMetrics.getDelay(), 0); + Assert.assertEquals(taskMetrics.getResourceUsed(), 0); + Assert.assertEquals(taskMetrics.getResourceWasted(), 0); + } + @Test public void testTaskLevelData() { MapReduceTaskData taskData[] = new MapReduceTaskData[2];