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
Spark Streaming揭秘 Day5 初步贯通源码的更多相关文章
- Spark Streaming揭秘 Day23 启动关闭源码图解
Spark Streaming揭秘 Day23 启动关闭源码图解 今天主要分析一下SparkStreaming的启动和关闭过程. 从Demo程序出发,主要聚焦在两段代码: 启动代码: 关闭代码: 启动 ...
- Spark Streaming揭秘 Day26 JobGenerator源码图解
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...
- Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解
Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...
- Spark Streaming揭秘 Day22 架构源码图解
Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- Spark Streaming揭秘 Day7 再探Job Scheduler
Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...
- Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现
欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- Spark Streaming揭秘 Day34 解析UI监听模式
Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...
随机推荐
- Java中数组的快排
描述输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输入一个数N,表示有N组测试数据.后面的N行输入多组数据,每组输入数据都是占一行,有三个字符组成, ...
- 视频播放-VideoVIew,Vitamio
播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView类来实现的.这个类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器.VideoView的用法和 Med ...
- 【报错】"The constructor Notification(int, CharSequence, long) is deprecated
Notification的构造方法 Notification(int, CharSequence, long) 在API11之后就淘汰了,之后的API需要用Notification.Builder() ...
- Android 自学之对话框
Android为我们提供了丰富的对话框支持,提供了四种常用的对话框: AlertDialog:功能丰富.实际应用最广泛的对话框. ProgressDialog:进度对话框,该对话框只用于简单的进度条封 ...
- [改善Java代码] 推荐使用序列化实现对象的拷贝
建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何 ...
- Swift 性能探索和优化分析
本文首发在 CSDN<程序员>杂志,订阅地址 http://dingyue.programmer.com.cn/. Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程 ...
- Math.random获得随机数
function GetRandomNum(Min,Max){ var Range = Max - Min; var Rand = Math.random(); ...
- HOWTO: Be more productive
---by Aaron Swartz HOWTO: Be more productive “With all the time you spend watching TV,” he tells m ...
- xcode-重新打开欢迎界面
嫌不够逼格关掉 关掉又后悔= = 重新打开方式为: command+shift+1 然后把左下勾上就可以每次都打开了 一个字,折腾
- Amoeba For MySQL入门:实现数据库水平切分
当系统数据量发展到一定程度后,往往需要进行数据库的垂直切分和水平切分,以实现负载均衡和性能提升,而数据切分后随之会带来多数据源整合等等问题.如果仅仅从应用程序的角度去解决这类问题,无疑会加重应用程度的 ...