Spark Streaming揭秘 Day5 初步贯通源码
Spark Streaming揭秘 Day5
初步贯通源码
引子
今天,让我们从Spark Streaming最重要的三个环节出发,让我们通过走读,逐步贯通源码,还记得Day1提到的三个谜团么,让我们开始解密吧。
1.创建StreamingContext
StreamingContext是Spark Streaming是运行基础,也是负责管理和其运行的重要组件。
我们需要特别注意下面这段代码:
可以看到,StreamingContext内部包涵了一个SparkContext,这个可以告诉我们Streaming就是Spark Core上的一个应用程序,体现了不重复造轮子的原则,也是Spark Streaming能如此快发展的一个重要原因。
2.创建SocketInputDStream
还是以Demo代码为例,让我们进入StreamingContext的初始化
其最终是生成了一个SocketInputDstream
在继承关系中,比较关键是下面下两类:
SocketInputDStream*
-->DStream*
让我们一步一步分析:
2.1 SocketInputDStream
关键是其内部类SocketReceiver
调用流程:
ReceiverSupervisor.start()
-->启动线程调用SocketReceiver.onStart()
-->SocketReceiver.receive()
receive方法是实现具体的逻辑代码(根据不同类型的receiver有不同的实现,建立Socket连接,然后一直循环store)
2.2 DStream,本身是RDD的模板,主要提供生成新RDD的功能
2.2.1 RDD的存储:
可以看到RDD是使用HashMap存储起来,DStream的本质就是存储的一系列的数据流。
2.2.2 RDD的生成:
getOrCompute方法完成了RDD的生成,是SparkStreaming的核心部分,后续会再深入各个子类的compute方法进行研究。
3.StreamingContext启动(start)
让我们进入start方法
这里有两个要注意的地方:
首先,会出现一个判断状态,其作用主要是用来确保一个程序中不能有多个SparkContext,这个也是所有Spark程序都会有的一个限制。
其次,采用了新建Thread的方式进行启动,其中Property采用的是ThreadLocal变量,从确保不同线程间参数信息不会混淆。
让我们进入启动代码的主体:
首先,开启一个eventLoop进行异步调用,进行一些状态信息的管理,eventLoop是Spark中延时调度的实现,非常的精彩,建议仔细阅读下。
其次,启动了rateController速率控制器,这个是SparkStreaming高容错特性的核心。
之后,又到了Day4中提到的ReceiverTrack和JobGenerator
下面,出现了一个很有特色的代码
runDummySparkJob 从注释看,这个Job主要确保Slave在正常工作,是的,这就是三个谜团中提到的Job0,我们可以把其认为是系统自检。
然后,通过调度算法,可以决定在哪个地方启动receiver
让我们再往下,有一个关键出现了:
是的,这个就是三个谜团中提到的Job1 ,利用这个Job,我们可以传递函数至Executor启动ReceiverSupervisor,这里巧妙的利用了Spark分布式机制来实现对于receiver这样基础设施的分布式管理,在不动声色间搞定了一切!!!
最后是JobGenerator的调用,这里,最为关键的概念就是线程池,这个在Day4中已经解析过,就不再重复。
小结
至此,我们走读了SparkContext启动时的关键代码,同时解密了Job0和Job1的作用!!!Spark Streaming中的重要功能基本也是在Spark Core的基础上构造的,它其实是Spark Core上的一个应用程序,那么我们自己编写应用程序的时候,是不是可以有所借鉴呢?
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580