DT大数据梦工厂Spark定制班笔记(005)

Spark Streaming Job运行流程图

DT大数据梦工厂Spark定制班笔记(005)_第1张图片

所有代码分析均基于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


你可能感兴趣的:(DT大数据梦工厂Spark定制班笔记(005))