diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala index bfa54f849206..328077a11a20 100644 --- a/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala +++ b/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala @@ -33,11 +33,13 @@ import org.apache.spark.scheduler.{AccumulableInfo, TaskInfo} /** Page showing statistics and task list for a given stage */ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") { private val listener = parent.listener - + private val pageSize = 1000 + def render(request: HttpServletRequest): Seq[Node] = { listener.synchronized { val stageId = request.getParameter("id").toInt val stageAttemptId = request.getParameter("attempt").toInt + val requestedPage = Option(request.getParameter("page")).getOrElse("1").toInt val stageDataOption = listener.stageIdToData.get((stageId, stageAttemptId)) if (stageDataOption.isEmpty || stageDataOption.get.taskData.isEmpty) { @@ -52,6 +54,12 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") { val stageData = stageDataOption.get val tasks = stageData.taskData.values.toSeq.sortBy(_.taskInfo.launchTime) + + val requestedFirst = (requestedPage - 1) * pageSize + val pageCount = tasks.size / pageSize + (if (tasks.size % pageSize > 0) 1 else 0) + val actualFirst = if (requestedFirst < tasks.size) requestedFirst else 0 + val actualPage = (actualFirst / pageSize) + 1 + val showTasks = tasks.slice(actualFirst, Math.min(actualFirst + pageSize, tasks.size)) val numCompleted = tasks.count(_.taskInfo.finished) val accumulables = listener.stageIdToData((stageId, stageAttemptId)).accumulables @@ -186,7 +194,7 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") { unzipped._1, taskRow(hasAccumulators, hasInput, hasOutput, hasShuffleRead, hasShuffleWrite, hasBytesSpilled), - tasks, + showTasks, headerClasses = unzipped._2) // Excludes tasks which failed and have incomplete metrics val validTasks = tasks.filter(t => t.taskInfo.status == "SUCCESS" && t.taskMetrics.isDefined) @@ -345,7 +353,20 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") {
{summaryTable.getOrElse("No tasks have reported metrics yet.")}
++

Aggregated Metrics by Executor

++ executorTable.toNodeSeq ++ maybeAccumulableTable ++ -

Tasks

++ taskTable +

Tasks + + {if (actualPage > 1) { +