1818package org .apache .spark .deploy .rest
1919
2020import java .io .DataOutputStream
21+ import java .net .InetSocketAddress
2122import javax .servlet .http .{HttpServletRequest , HttpServletResponse }
2223
2324import scala .io .Source
@@ -26,25 +27,37 @@ import com.google.common.base.Charsets
2627import org .eclipse .jetty .server .{Request , Server }
2728import org .eclipse .jetty .server .handler .AbstractHandler
2829
29- import org .apache .spark .{Logging , SPARK_VERSION => sparkVersion }
30- import org .apache .spark .deploy .rest . StandaloneRestProtocolAction . _
31- import org .apache .spark .util .Utils
30+ import org .apache .spark .{SPARK_VERSION => sparkVersion , Logging }
31+ import org .apache .spark .deploy .master . Master
32+ import org .apache .spark .util .{ AkkaUtils , Utils }
3233
3334/**
3435 * A server that responds to requests submitted by the StandaloneRestClient.
3536 */
36- private [spark] class StandaloneRestServer (requestedPort : Int ) {
37- val server = new Server (requestedPort)
38- server.setHandler(new StandaloneRestHandler )
37+ private [spark] class StandaloneRestServer (master : Master , host : String , requestedPort : Int ) {
38+ val server = new Server (new InetSocketAddress (host, requestedPort) )
39+ server.setHandler(new StandaloneRestServerHandler (master) )
3940 server.start()
40- server.join()
4141}
4242
4343/**
4444 * A Jetty handler that responds to requests submitted via the standalone REST protocol.
4545 */
46- private [spark] class StandaloneRestHandler extends AbstractHandler with Logging {
46+ private [spark] abstract class StandaloneRestHandler (master : Master )
47+ extends AbstractHandler with Logging {
4748
49+ private implicit val askTimeout = AkkaUtils .askTimeout(master.conf)
50+
51+ /** Handle a request to submit a driver. */
52+ protected def handleSubmit (request : SubmitDriverRequestMessage ): SubmitDriverResponseMessage
53+ /** Handle a request to kill a driver. */
54+ protected def handleKill (request : KillDriverRequestMessage ): KillDriverResponseMessage
55+ /** Handle a request for a driver's status. */
56+ protected def handleStatus (request : DriverStatusRequestMessage ): DriverStatusResponseMessage
57+
58+ /**
59+ * Handle a request submitted by the StandaloneRestClient.
60+ */
4861 override def handle (
4962 target : String ,
5063 baseRequest : Request ,
@@ -67,74 +80,32 @@ private[spark] class StandaloneRestHandler extends AbstractHandler with Logging
6780 }
6881 }
6982
83+ /**
84+ * Construct the appropriate response message based on the type of the request message.
85+ * If an IllegalArgumentException is thrown in the process, construct an error message.
86+ */
7087 private def constructResponseMessage (
7188 request : StandaloneRestProtocolMessage ): StandaloneRestProtocolMessage = {
7289 // If the request is sent via the StandaloneRestClient, it should have already been
7390 // validated remotely. In case this is not true, validate the request here to guard
7491 // against potential NPEs. If validation fails, return an ERROR message to the sender.
7592 try {
7693 request.validate()
94+ request match {
95+ case submit : SubmitDriverRequestMessage => handleSubmit(submit)
96+ case kill : KillDriverRequestMessage => handleKill(kill)
97+ case status : DriverStatusRequestMessage => handleStatus(status)
98+ case unexpected => handleError(
99+ s " Received message of unexpected type ${Utils .getFormattedClassName(unexpected)}. " )
100+ }
77101 } catch {
78- case e : IllegalArgumentException =>
79- return handleError(e.getMessage)
80- }
81- request match {
82- case submit : SubmitDriverRequestMessage => handleSubmitRequest(submit)
83- case kill : KillDriverRequestMessage => handleKillRequest(kill)
84- case status : DriverStatusRequestMessage => handleStatusRequest(status)
85- case unexpected => handleError(
86- s " Received message of unexpected type ${Utils .getFormattedClassName(unexpected)}. " )
102+ // Propagate exception to user in an ErrorMessage. If the construction of the
103+ // ErrorMessage itself throws an exception, log the exception and ignore the request.
104+ case e : IllegalArgumentException => handleError(e.getMessage)
87105 }
88106 }
89107
90- private def handleSubmitRequest (
91- request : SubmitDriverRequestMessage ): SubmitDriverResponseMessage = {
92- import SubmitDriverResponseField ._
93- // TODO: Actually submit the driver
94- val message = " Driver is submitted successfully..."
95- val master = request.getField(SubmitDriverRequestField .MASTER )
96- val driverId = " new_driver_id"
97- val driverState = " SUBMITTED"
98- new SubmitDriverResponseMessage ()
99- .setField(SPARK_VERSION , sparkVersion)
100- .setField(MESSAGE , message)
101- .setField(MASTER , master)
102- .setField(DRIVER_ID , driverId)
103- .setField(DRIVER_STATE , driverState)
104- .validate()
105- }
106-
107- private def handleKillRequest (request : KillDriverRequestMessage ): KillDriverResponseMessage = {
108- import KillDriverResponseField ._
109- // TODO: Actually kill the driver
110- val message = " Driver is killed successfully..."
111- val master = request.getField(KillDriverRequestField .MASTER )
112- val driverId = request.getField(KillDriverRequestField .DRIVER_ID )
113- val driverState = " KILLED"
114- new KillDriverResponseMessage ()
115- .setField(SPARK_VERSION , sparkVersion)
116- .setField(MESSAGE , message)
117- .setField(MASTER , master)
118- .setField(DRIVER_ID , driverId)
119- .setField(DRIVER_STATE , driverState)
120- .validate()
121- }
122-
123- private def handleStatusRequest (
124- request : DriverStatusRequestMessage ): DriverStatusResponseMessage = {
125- import DriverStatusResponseField ._
126- // TODO: Actually look up the status of the driver
127- val master = request.getField(DriverStatusRequestField .MASTER )
128- val driverId = request.getField(DriverStatusRequestField .DRIVER_ID )
129- val driverState = " HEALTHY"
130- new DriverStatusResponseMessage ()
131- .setField(SPARK_VERSION , sparkVersion)
132- .setField(MASTER , master)
133- .setField(DRIVER_ID , driverId)
134- .setField(DRIVER_STATE , driverState)
135- .validate()
136- }
137-
108+ /** Construct an error message to signal the fact that an exception has been thrown. */
138109 private def handleError (message : String ): ErrorMessage = {
139110 import ErrorField ._
140111 new ErrorMessage ()
@@ -144,10 +115,10 @@ private[spark] class StandaloneRestHandler extends AbstractHandler with Logging
144115 }
145116}
146117
147- object StandaloneRestServer {
148- def main (args : Array [String ]): Unit = {
149- println(" Hey boy I'm starting a server." )
150- new StandaloneRestServer (6677 )
151- readLine()
152- }
153- }
118+ // object StandaloneRestServer {
119+ // def main(args: Array[String]): Unit = {
120+ // println("Hey boy I'm starting a server.")
121+ // new StandaloneRestServer(6677)
122+ // readLine()
123+ // }
124+ // }
0 commit comments