1717
1818package org .apache .spark .streaming .scheduler
1919
20- import scala .util .{Failure , Success , Try }
20+ import scala .util .{Failure , Success }
2121import scala .collection .JavaConversions ._
2222import java .util .concurrent .{TimeUnit , ConcurrentHashMap , Executors }
23- import akka .actor .{ActorRef , Actor , Props }
24- import org .apache .spark .{SparkException , Logging , SparkEnv }
23+ import org .apache .spark .Logging
2524import org .apache .spark .rdd .PairRDDFunctions
2625import org .apache .spark .streaming ._
26+ import org .apache .spark .util .EventLoop
2727
2828
2929private [scheduler] sealed trait JobSchedulerEvent
@@ -48,19 +48,18 @@ class JobScheduler(val ssc: StreamingContext) extends Logging {
4848 // These two are created only when scheduler starts.
4949 // eventActor not being null means the scheduler has been started and not stopped
5050 var receiverTracker : ReceiverTracker = null
51- private var eventActor : ActorRef = null
52-
51+ private var eventLoop : EventLoop [JobSchedulerEvent ] = null
5352
5453 def start (): Unit = synchronized {
55- if (eventActor != null ) return // scheduler has already been started
54+ if (eventLoop != null ) return // scheduler has already been started
5655
5756 logDebug(" Starting JobScheduler" )
58- eventActor = ssc.env.actorSystem.actorOf(Props (new Actor {
59- override def receive : PartialFunction [Any , Unit ] = {
60- case event : JobSchedulerEvent => processEvent(event)
61- }
62- }), " JobScheduler" )
57+ eventLoop = new EventLoop [JobSchedulerEvent ](" JobScheduler" ) {
58+ override protected def onReceive (event : JobSchedulerEvent ): Unit = processEvent(event)
6359
60+ override protected def onError (e : Throwable ): Unit = reportError(" Error in job scheduler" , e)
61+ }
62+ eventLoop.start()
6463 listenerBus.start(ssc.sparkContext)
6564 receiverTracker = new ReceiverTracker (ssc)
6665 receiverTracker.start()
@@ -69,7 +68,7 @@ class JobScheduler(val ssc: StreamingContext) extends Logging {
6968 }
7069
7170 def stop (processAllReceivedData : Boolean ): Unit = synchronized {
72- if (eventActor == null ) return // scheduler has already been stopped
71+ if (eventLoop == null ) return // scheduler has already been stopped
7372 logDebug(" Stopping JobScheduler" )
7473
7574 // First, stop receiving
@@ -96,8 +95,8 @@ class JobScheduler(val ssc: StreamingContext) extends Logging {
9695
9796 // Stop everything else
9897 listenerBus.stop()
99- ssc.env.actorSystem. stop(eventActor )
100- eventActor = null
98+ eventLoop. stop()
99+ eventLoop = null
101100 logInfo(" Stopped JobScheduler" )
102101 }
103102
@@ -117,7 +116,7 @@ class JobScheduler(val ssc: StreamingContext) extends Logging {
117116 }
118117
119118 def reportError (msg : String , e : Throwable ) {
120- eventActor ! ErrorReported (msg, e)
119+ eventLoop.post( ErrorReported (msg, e) )
121120 }
122121
123122 private def processEvent (event : JobSchedulerEvent ) {
@@ -172,14 +171,14 @@ class JobScheduler(val ssc: StreamingContext) extends Logging {
172171
173172 private class JobHandler (job : Job ) extends Runnable {
174173 def run () {
175- eventActor ! JobStarted (job)
174+ eventLoop.post( JobStarted (job) )
176175 // Disable checks for existing output directories in jobs launched by the streaming scheduler,
177176 // since we may need to write output to an existing directory during checkpoint recovery;
178177 // see SPARK-4835 for more details.
179178 PairRDDFunctions .disableOutputSpecValidation.withValue(true ) {
180179 job.run()
181180 }
182- eventActor ! JobCompleted (job)
181+ eventLoop.post( JobCompleted (job) )
183182 }
184183 }
185184}
0 commit comments