aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/scala/spark/ui/storage/RDDPage.scala
blob: 428db6fa95670f1e76c5e5fd15283d9066bb1f6c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package spark.ui.storage

import javax.servlet.http.HttpServletRequest

import scala.xml.Node

import spark.storage.{StorageStatus, StorageUtils}
import spark.ui.UIUtils._
import spark.Utils
import spark.storage.BlockManagerMasterActor.BlockStatus
import spark.ui.Page._

/** Page showing storage details for a given RDD */
private[spark] class RDDPage(parent: BlockManagerUI) {
  val sc = parent.sc

  def render(request: HttpServletRequest): Seq[Node] = {
    val id = request.getParameter("id")
    val prefix = "rdd_" + id.toString
    val storageStatusList = sc.getExecutorStorageStatus
    val filteredStorageStatusList = StorageUtils.
      filterStorageStatusByPrefix(storageStatusList, prefix)
    val rddInfo = StorageUtils.rddInfoFromStorageStatus(filteredStorageStatusList, sc).head

    val workerHeaders = Seq("Host", "Memory Usage", "Disk Usage")
    val workers = filteredStorageStatusList.map((prefix, _))
    val workerTable = listingTable(workerHeaders, workerRow, workers)

    val blockHeaders = Seq("Block Name", "Storage Level", "Size in Memory", "Size on Disk",
      "Locations")

    val blockStatuses = filteredStorageStatusList.flatMap(_.blocks).toArray.sortWith(_._1 < _._1)
    val blockLocations = StorageUtils.blockLocationsFromStorageStatus(filteredStorageStatusList)
    val blocks = blockStatuses.map {
      case(id, status) => (id, status, blockLocations.get(id).getOrElse(Seq("UNKNOWN")))
    }
    val blockTable = listingTable(blockHeaders, blockRow, blocks)

    val content =
      <div class="row">
        <div class="span12">
          <ul class="unstyled">
            <li>
              <strong>Storage Level:</strong>
              {rddInfo.storageLevel.description}
            </li>
            <li>
              <strong>Cached Partitions:</strong>
              {rddInfo.numCachedPartitions}
            </li>
            <li>
              <strong>Total Partitions:</strong>
              {rddInfo.numPartitions}
            </li>
            <li>
              <strong>Memory Size:</strong>
              {Utils.memoryBytesToString(rddInfo.memSize)}
            </li>
            <li>
              <strong>Disk Size:</strong>
              {Utils.memoryBytesToString(rddInfo.diskSize)}
            </li>
          </ul>
        </div>
      </div>
      <hr/>
      <div class="row">
        <div class="span12">
          {workerTable}
        </div>
      </div>
      <hr/>
      <div class="row">
        <div class="span12">
          <h3> RDD Summary </h3>
          {blockTable}
        </div>
      </div>;

    headerSparkPage(content, parent.sc, "RDD Info: " + rddInfo.name, Jobs)
  }

  def blockRow(row: (String, BlockStatus, Seq[String])): Seq[Node] = {
    val (id, block, locations) = row
    <tr>
      <td>{id}</td>
      <td>
        {block.storageLevel.description}
      </td>
      <td sorttable_customkey={block.memSize.toString}>
        {Utils.memoryBytesToString(block.memSize)}
      </td>
      <td sorttable_customkey={block.diskSize.toString}>
        {Utils.memoryBytesToString(block.diskSize)}
      </td>
      <td>
        {locations.map(l => <span>{l}<br/></span>)}
      </td>
    </tr>
  }

  def workerRow(worker: (String, StorageStatus)): Seq[Node] = {
    val (prefix, status) = worker
    <tr>
      <td>{status.blockManagerId.host + ":" + status.blockManagerId.port}</td>
      <td>
        {Utils.memoryBytesToString(status.memUsed(prefix))}
        ({Utils.memoryBytesToString(status.memRemaining)} Total Available)
      </td>
      <td>{Utils.memoryBytesToString(status.diskUsed(prefix))}</td>
    </tr>
  }
}