diff --git a/core/src/main/scala/org/apache/spark/deploy/ClientArguments.scala b/core/src/main/scala/org/apache/spark/deploy/ClientArguments.scala index 50b92e1eabecace5c5223a76755332ec5e1561dc..db67c6d1bb55c58069a23a7d2d3abb01a4d2a1ea 100644 --- a/core/src/main/scala/org/apache/spark/deploy/ClientArguments.scala +++ b/core/src/main/scala/org/apache/spark/deploy/ClientArguments.scala @@ -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 diff --git a/core/src/main/scala/org/apache/spark/deploy/master/ui/IndexPage.scala b/core/src/main/scala/org/apache/spark/deploy/master/ui/IndexPage.scala index db1dde59d6c9db5159736746eea2f66f61214ea4..a9af8df5525d68375b552be8526e3f1a685da111 100644 --- a/core/src/main/scala/org/apache/spark/deploy/master/ui/IndexPage.scala +++ b/core/src/main/scala/org/apache/spark/deploy/master/ui/IndexPage.scala @@ -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,26 +102,35 @@ private[spark] class IndexPage(parent: MasterWebUI) { </div> </div> - <div class="row-fluid"> - <div class="span12"> - <h4> Completed Applications </h4> - {completedAppsTable} + <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> Active Drivers </h4> - {activeDriversTable} + <h4> Completed Applications </h4> + {completedAppsTable} </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> } } diff --git a/core/src/main/scala/org/apache/spark/deploy/worker/ui/IndexPage.scala b/core/src/main/scala/org/apache/spark/deploy/worker/ui/IndexPage.scala index 0a7f56e2d310a7add74bdba56059a40f1516c95c..925c6fb1832d7eff6adea8d51c91baf937ef0a97 100644 --- a/core/src/main/scala/org/apache/spark/deploy/worker/ui/IndexPage.scala +++ b/core/src/main/scala/org/apache/spark/deploy/worker/ui/IndexPage.scala @@ -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}