Spark Streaming Job运行流程图
所有代码分析均基于Apache Spark1.6.1
Spark Streaming初始化
Spark Streaming初始化的时候,会初始化一系列对下如SparkContext, DStreamGraph和JobScheduler等。
具体代码可以参照StreamingContext.scala (136-183行)。
JobScheduler在初始化过程中,会初始化JobGenerator和StreamingListenerBus。
代码如下,分别为JobScheduler.scala 53行,55行。
private val jobGenerator = new JobGenerator(this) val listenerBus = new StreamingListenerBus(ssc.sparkContext.listenerBus)
其中JobGenerator在初始化过程中会初始化RecurringTimer对象(JobGenerator.scala 60-61行)。
private val timer = new RecurringTimer(clock, ssc.graph.batchDuration.milliseconds, longTime => eventLoop.post(GenerateJobs(new Time(longTime))), "JobGenerator")
该对象会定时向EventLoop发送GenerateJobs。
设置InputStream
ssc.socketTextStream()
socketTextStream的定义如下(StreamingContext 297行)
def socketTextStream( hostname: String, port: Int, storageLevel: StorageLevel = StorageLevel.MEMORY_AND_DISK_SER_2 ): ReceiverInputDStream[String] = withNamedScope("socket text stream") { socketStream[String](hostname, port, SocketReceiver.bytesToLines, storageLevel) }其返回类型为 ReceiverInputDStream,内部调用 socketStream。
def socketStream[T: ClassTag]( hostname: String, port: Int, converter: (InputStream) => Iterator[T], storageLevel: StorageLevel ): ReceiverInputDStream[T] = { new SocketInputDStream[T](this, hostname, port, converter, storageLevel) }
SocketInPutDStream的继承关系如下:
SocketInputDStream -> ReceiverInputDStream -> InputDStream -> DStream
其中InputDStream在初始化过程中会执行如下操作 InputDStream.scala (47行)
ssc.graph.addInputStream(this)
将SocketINputDStream实例加入到DStreamGraph数据结构inputStreams中
调用Print操作
最终会将输出流加入到DStreamGraph的outputStreams中
代码分析稍后奉上。
Streaming Job启动
Streamming Job启动后,会通过JobScheduler相继启动receiverTracker和jobGenerator