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系统使用的是监听器模式. ...
随机推荐
- c语言_帮助别人
1. /*4.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大.在该列上最小,也可能没有鞍点*/ #include<stdio.h> int main() { int i,j,max ...
- syntax error: missing ';' before identifier 'IWebBrowser'
遇到这个错误. google的结果是 去掉 WIN32_LEAN_AND_MEAN 宏定义 然而由于项目中使用了很多第三方库, 如果去掉这个宏, 会导致其他项目编译错了. 关于这个宏有什么用, 可以百 ...
- JavaFX(二)自定义窗口标题栏
1.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 2.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...
- SelectionKey理解(总结)
SelectKey注册了写事件,不在合适的时间去除掉,会一直触发写事件,因为写事件是代码触发的 client.register(selector, SelectionKey.OP_WRITE); 或者 ...
- 关于 ES6箭头函数
转自 http://simplyy.space/article/577c5b0dcbe0a3e656c87c24 多个连续的箭头函数与柯里化 高阶函数 高阶函数定义:将函数作为参数或者返回值是函 ...
- Android 自学之对话框
Android为我们提供了丰富的对话框支持,提供了四种常用的对话框: AlertDialog:功能丰富.实际应用最广泛的对话框. ProgressDialog:进度对话框,该对话框只用于简单的进度条封 ...
- javascript一些常用操作
一:验证日期 1:日期必须满足yyyy-MM-dd格式 2:日期必须是合法的日期,如2016-02-30就是不存在 //验证就诊日期 function checkVisitDate(date){ va ...
- 怎么在html页面和js里判断是否是IE浏览器
HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...
- 从医生看病和快餐店点餐理解Node.js的事件驱动
第一个例子是关于医生看病. 在美国去看医生,需要填写大量表格,比如保险.个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着 ...
- 关于Eclipse的Save时的自定义操作
Eclipse中Save+S的时候会包含很多其他操作.例如代码格式化,自动导入或者删除jar包等等. 如果修改代码的时候不想让Eclipse做这些操作,有两种方法. 第一: 用一个文本编辑器打开这个文 ...