Skip to content

Commit ce0fa73

Browse files
committed
Replace JobScheduler.eventActor with EventLoop
1 parent 8220d52 commit ce0fa73

1 file changed

Lines changed: 16 additions & 17 deletions

File tree

streaming/src/main/scala/org/apache/spark/streaming/scheduler/JobScheduler.scala

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717

1818
package org.apache.spark.streaming.scheduler
1919

20-
import scala.util.{Failure, Success, Try}
20+
import scala.util.{Failure, Success}
2121
import scala.collection.JavaConversions._
2222
import 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
2524
import org.apache.spark.rdd.PairRDDFunctions
2625
import org.apache.spark.streaming._
26+
import org.apache.spark.util.EventLoop
2727

2828

2929
private[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

Comments
 (0)