Some usability improvements

This commit is contained in:
Patrick Wendell 2014-01-09 12:42:37 -08:00
parent 0f9d2ace6b
commit 67b9a33628
3 changed files with 63 additions and 26 deletions

View file

@ -17,6 +17,8 @@
package org.apache.spark.deploy
import java.net.URL
import scala.collection.mutable.ListBuffer
import org.apache.log4j.Level
@ -68,8 +70,18 @@ private[spark] class ClientArguments(args: Array[String]) {
case "launch" :: _master :: _jarUrl :: _mainClass :: tail =>
cmd = "launch"
master = _master
try {
new URL(_jarUrl)
} catch {
case e: Exception =>
println(s"Jar url '${_jarUrl}' is not a valid URL.")
println(s"Jar must be in URL format (e.g. hdfs://XX, file://XX)")
printUsageAndExit(-1)
}
jarUrl = _jarUrl
master = _master
mainClass = _mainClass
_driverOptions ++= tail

View file

@ -63,6 +63,10 @@ private[spark] class IndexPage(parent: MasterWebUI) {
val completedDrivers = state.completedDrivers.sortBy(_.startTime).reverse
val completedDriversTable = UIUtils.listingTable(driverHeaders, driverRow, completedDrivers)
// For now we only show driver information if the user has submitted drivers to the cluster.
// This is until we integrate the notion of drivers and applications in the UI.
def hasDrivers = activeDrivers.length > 0 || completedDrivers.length > 0
val content =
<div class="row-fluid">
<div class="span12">
@ -98,6 +102,17 @@ private[spark] class IndexPage(parent: MasterWebUI) {
</div>
</div>
<div>
{if (hasDrivers)
<div class="row-fluid">
<div class="span12">
<h4> Running Drivers </h4>
{activeDriversTable}
</div>
</div>
}
</div>
<div class="row-fluid">
<div class="span12">
<h4> Completed Applications </h4>
@ -105,19 +120,17 @@ private[spark] class IndexPage(parent: MasterWebUI) {
</div>
</div>
<div class="row-fluid">
<div class="span12">
<h4> Active Drivers </h4>
{activeDriversTable}
</div>
</div>
<div class="row-fluid">
<div class="span12">
<h4> Completed Drivers </h4>
{completedDriversTable}
<div>
{if (hasDrivers)
<div class="row-fluid">
<div class="span12">
<h4> Completed Drivers </h4>
{completedDriversTable}
</div>
</div>
}
</div>;
UIUtils.basicSparkPage(content, "Spark Master at " + state.uri)
}
@ -170,7 +183,7 @@ private[spark] class IndexPage(parent: MasterWebUI) {
<td sorttable_customkey={driver.desc.mem.toString}>
{Utils.megabytesToString(driver.desc.mem.toLong)}
</td>
<td>{driver.desc.command.mainClass}</td>
<td>{driver.desc.command.arguments(1)}</td>
</tr>
}
}

View file

@ -58,6 +58,10 @@ private[spark] class IndexPage(parent: WorkerWebUI) {
val finishedDrivers = workerState.finishedDrivers.sortBy(_.driverId).reverse
def finishedDriverTable = UIUtils.listingTable(driverHeaders, driverRow, finishedDrivers)
// For now we only show driver information if the user has submitted drivers to the cluster.
// This is until we integrate the notion of drivers and applications in the UI.
def hasDrivers = runningDrivers.length > 0 || finishedDrivers.length > 0
val content =
<div class="row-fluid"> <!-- Worker Details -->
<div class="span12">
@ -81,6 +85,17 @@ private[spark] class IndexPage(parent: WorkerWebUI) {
</div>
</div>
<div>
{if (hasDrivers)
<div class="row-fluid"> <!-- Running Drivers -->
<div class="span12">
<h4> Running Drivers {workerState.drivers.size} </h4>
{runningDriverTable}
</div>
</div>
}
</div>
<div class="row-fluid"> <!-- Finished Executors -->
<div class="span12">
<h4> Finished Executors </h4>
@ -88,18 +103,15 @@ private[spark] class IndexPage(parent: WorkerWebUI) {
</div>
</div>
<div class="row-fluid"> <!-- Running Drivers -->
<div class="span12">
<h4> Running Drivers {workerState.drivers.size} </h4>
{runningDriverTable}
</div>
</div>
<div class="row-fluid"> <!-- Finished Drivers -->
<div class="span12">
<h4> Finished Drivers </h4>
{finishedDriverTable}
</div>
<div>
{if (hasDrivers)
<div class="row-fluid"> <!-- Finished Drivers -->
<div class="span12">
<h4> Finished Drivers </h4>
{finishedDriverTable}
</div>
</div>
}
</div>;
UIUtils.basicSparkPage(content, "Spark Worker at %s:%s".format(
@ -133,7 +145,7 @@ private[spark] class IndexPage(parent: WorkerWebUI) {
def driverRow(driver: DriverRunner): Seq[Node] = {
<tr>
<td>{driver.driverId}</td>
<td>{driver.driverDesc.command.mainClass}</td>
<td>{driver.driverDesc.command.arguments(1)}</td>
<td>{driver.finalState.getOrElse(DriverState.RUNNING)}</td>
<td sorttable_customkey={driver.driverDesc.cores.toString}>
{driver.driverDesc.cores.toString}