diff --git a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsPage.scala b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsPage.scala index 1a29b0f412603..c162598040b63 100644 --- a/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsPage.scala +++ b/core/src/main/scala/org/apache/spark/ui/exec/ExecutorsPage.scala @@ -61,10 +61,28 @@ private[ui] class ExecutorsPage( val execInfoSorted = execInfo.sortBy(_.id) val logsExist = execInfo.filter(_.executorLogs.nonEmpty).nonEmpty + val sumInfo = new ExecutorSummary( + "", + "", + execInfo.map(_.rddBlocks).sum, + execInfo.map(_.memoryUsed).sum, + execInfo.map(_.diskUsed).sum, + execInfo.map(_.activeTasks).sum, + execInfo.map(_.failedTasks).sum, + execInfo.map(_.completedTasks).sum, + execInfo.map(_.totalTasks).sum, + execInfo.map(_.totalDuration).sum, + execInfo.map(_.totalInputBytes).sum, + execInfo.map(_.totalShuffleRead).sum, + execInfo.map(_.totalShuffleWrite).sum, + execInfo.map(_.maxMemory).sum, + Map.empty + ) + val execTable = - + @@ -88,6 +106,7 @@ private[ui] class ExecutorsPage( {if (threadDumpEnabled) else Seq.empty} + {execRow(sumInfo, logsExist)} {execInfoSorted.map(execRow(_, logsExist))}
Executor IDExecutor ID Address RDD Blocks Storage MemoryThread Dump
@@ -114,12 +133,23 @@ private[ui] class ExecutorsPage( /** Render an HTML row representing an executor */ private def execRow(info: ExecutorSummary, logsExist: Boolean): Seq[Node] = { + val totalRow = info.id.isEmpty && info.hostPort.isEmpty; val maximumMemory = info.maxMemory val memoryUsed = info.memoryUsed val diskUsed = info.diskUsed - {info.id} - {info.hostPort} + { + if (totalRow) + + else + {info.id} + } + { + if (totalRow) + "TOTALS" + else + {info.hostPort} + } {info.rddBlocks} {Utils.bytesToString(memoryUsed)} / @@ -148,12 +178,14 @@ private[ui] class ExecutorsPage( if (logsExist) { { - info.executorLogs.map { case (logName, logUrl) => -
- - {logName} - -
+ if (!totalRow) { + info.executorLogs.map { case (logName, logUrl) => +
+ + {logName} + +
+ } } } @@ -163,7 +195,11 @@ private[ui] class ExecutorsPage( if (threadDumpEnabled) { val encodedId = URLEncoder.encode(info.id, "UTF-8") - Thread Dump + { + if (!totalRow) { + Thread Dump + } + } } else { Seq.empty