Skip to content
Snippets Groups Projects
Commit 01413ca0 authored by Matei Zaharia's avatar Matei Zaharia
Browse files

Merge pull request #364 from tysonjh/master

Executor and JobDescription JSON support added
parents 3ef82496 1731f1fe
No related branches found
No related tags found
No related merge requests found
package spark.deploy package spark.deploy
import master.{JobInfo, WorkerInfo} import master.{JobInfo, WorkerInfo}
import worker.ExecutorRunner
import cc.spray.json._ import cc.spray.json._
/** /**
...@@ -30,6 +31,24 @@ private[spark] object JsonProtocol extends DefaultJsonProtocol { ...@@ -30,6 +31,24 @@ private[spark] object JsonProtocol extends DefaultJsonProtocol {
"submitdate" -> JsString(obj.submitDate.toString)) "submitdate" -> JsString(obj.submitDate.toString))
} }
implicit object JobDescriptionJsonFormat extends RootJsonWriter[JobDescription] {
def write(obj: JobDescription) = JsObject(
"name" -> JsString(obj.name),
"cores" -> JsNumber(obj.cores),
"memoryperslave" -> JsNumber(obj.memoryPerSlave),
"user" -> JsString(obj.user)
)
}
implicit object ExecutorRunnerJsonFormat extends RootJsonWriter[ExecutorRunner] {
def write(obj: ExecutorRunner) = JsObject(
"id" -> JsNumber(obj.execId),
"memory" -> JsNumber(obj.memory),
"jobid" -> JsString(obj.jobId),
"jobdesc" -> obj.jobDesc.toJson.asJsObject
)
}
implicit object MasterStateJsonFormat extends RootJsonWriter[MasterState] { implicit object MasterStateJsonFormat extends RootJsonWriter[MasterState] {
def write(obj: MasterState) = JsObject( def write(obj: MasterState) = JsObject(
"url" -> JsString("spark://" + obj.uri), "url" -> JsString("spark://" + obj.uri),
...@@ -51,7 +70,9 @@ private[spark] object JsonProtocol extends DefaultJsonProtocol { ...@@ -51,7 +70,9 @@ private[spark] object JsonProtocol extends DefaultJsonProtocol {
"cores" -> JsNumber(obj.cores), "cores" -> JsNumber(obj.cores),
"coresused" -> JsNumber(obj.coresUsed), "coresused" -> JsNumber(obj.coresUsed),
"memory" -> JsNumber(obj.memory), "memory" -> JsNumber(obj.memory),
"memoryused" -> JsNumber(obj.memoryUsed) "memoryused" -> JsNumber(obj.memoryUsed),
"executors" -> JsArray(obj.executors.toList.map(_.toJson)),
"finishedexecutors" -> JsArray(obj.finishedExecutors.toList.map(_.toJson))
) )
} }
} }
...@@ -38,20 +38,36 @@ class MasterWebUI(val actorSystem: ActorSystem, master: ActorRef) extends Direct ...@@ -38,20 +38,36 @@ class MasterWebUI(val actorSystem: ActorSystem, master: ActorRef) extends Direct
} }
} ~ } ~
path("job") { path("job") {
parameter("jobId") { jobId => parameters("jobId", 'format ?) {
completeWith { case (jobId, Some(js)) if (js.equalsIgnoreCase("json")) =>
val future = master ? RequestMasterState val future = master ? RequestMasterState
future.map { state => val jobInfo = for (masterState <- future.mapTo[MasterState]) yield {
val masterState = state.asInstanceOf[MasterState] masterState.activeJobs.find(_.id == jobId) match {
case Some(job) => job
// A bit ugly an inefficient, but we won't have a number of jobs case _ => masterState.completedJobs.find(_.id == jobId) match {
// so large that it will make a significant difference. case Some(job) => job
(masterState.activeJobs ++ masterState.completedJobs).find(_.id == jobId) match { case _ => null
case Some(job) => spark.deploy.master.html.job_details.render(job) }
case _ => null }
}
respondWithMediaType(MediaTypes.`application/json`) { ctx =>
ctx.complete(jobInfo.mapTo[JobInfo])
}
case (jobId, _) =>
completeWith {
val future = master ? RequestMasterState
future.map { state =>
val masterState = state.asInstanceOf[MasterState]
masterState.activeJobs.find(_.id == jobId) match {
case Some(job) => spark.deploy.master.html.job_details.render(job)
case _ => masterState.completedJobs.find(_.id == jobId) match {
case Some(job) => spark.deploy.master.html.job_details.render(job)
case _ => null
}
}
} }
} }
}
} }
} ~ } ~
pathPrefix("static") { pathPrefix("static") {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment