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 初步贯通源码的更多相关文章

  1. Spark Streaming揭秘 Day23 启动关闭源码图解

    Spark Streaming揭秘 Day23 启动关闭源码图解 今天主要分析一下SparkStreaming的启动和关闭过程. 从Demo程序出发,主要聚焦在两段代码: 启动代码: 关闭代码: 启动 ...

  2. Spark Streaming揭秘 Day26 JobGenerator源码图解

    Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...

  3. Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解

    Spark Streaming揭秘 Day25 StreamingContext和JobScheduler启动源码详解 今天主要理一下StreamingContext的启动过程,其中最为重要的就是Jo ...

  4. Spark Streaming揭秘 Day22 架构源码图解

    Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...

  5. Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕

    Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...

  6. Spark Streaming揭秘 Day7 再探Job Scheduler

    Spark Streaming揭秘 Day7 再探Job Scheduler 今天,我们对Job Scheduler再进一步深入一下,对一些更加细节的源码进行分析. Job Scheduler启动 在 ...

  7. Apache Spark源码走读之23 -- Spark MLLib中拟牛顿法L-BFGS的源码实现

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文就拟牛顿法L-BFGS的由来做一个简要的回顾,然后就其在spark mllib中的实现进行源码走读. 拟牛顿法 数学原理 代码实现 L-BFGS算法中使 ...

  8. Spark Streaming揭秘 Day35 Spark core思考

    Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...

  9. Spark Streaming揭秘 Day34 解析UI监听模式

    Spark Streaming揭秘 Day34 解析UI监听模式 今天分享下SparkStreaming中的UI部分,和所有的UI系统一样,SparkStreaming中的UI系统使用的是监听器模式. ...

随机推荐

  1. 使用c3p0连接池

    首先我们需要知道为什么要使用连接池:因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉,每次新建连接都需要140毫秒左右的时间而C3P0连接池会池化连接,随 ...

  2. 结合源码看nginx-1.4.0之nginx事件驱动机制详解

    目录 0. 摘要 1. nginx事件模块组织结构 2. nginx事件模块数据结构及类图 3. nginx事件模块运行机制 4. 练习:一个简单的事件驱动模块 5. 小结 6. 参考源码

  3. 前端必会css整理

    1.设置css样式的三种方式?         外部样式表,引入一个外部css文件         内部样式表,将css代码放在<head>标签内部         内联样式,将css样式 ...

  4. ganglia监控hadoop2.0配置方法

    ganglia监控hadoop2.0配置方法前提:hadoop2.0集群已安装ganglia监控工具第一步:Hadoop用户登录集群每一个节点,修改文件:vi /opt/hadoop-2.0.0-cd ...

  5. Linux系统内核制作和内核模块的基础

    Linux系统内核制作 1.清除原有配置与中间文件 x86:  make distclean arm:  make distclean 2.配置内核 x86:  make menuconfig arm ...

  6. iOS 视频开发-AVPlayer

    如果我只是简单的播放一个视频,而不需要考虑播放器的界面.iOS9.0 之前使用 MPMoviePlayerController, 或者内部自带一个 view 的 MPMoviePlayerViewCo ...

  7. JMS - 基本概念

    连接工厂创建连接对象的工厂. 连接客户端与 JMS 服务器之间建立的连接.创建一个或多个会话. 会话创建消息.生产者和消费者,会话是 消息由三部分组成:消息头.消息属性和消息体. 生产者创建和发送消息 ...

  8. ActiveMQ 的安装

    1. 在 http://activemq.apache.org/ 下载 ActiveMQ.Windows 系统选择下载 apache-activemq-x.x.x-bin.zip,Unix/Linux ...

  9. Asp.net MVC 4 Html帮助类

    Html帮助类 used to render (modify and output) HTML form elements 用来渲染HTML表单元素(修改和输出) Html.ActionLink 输出 ...

  10. Android PullToRefresh下拉刷新控件的简单使用

    PullToRefresh这个开源库早就听说了,不过一直没用过.作为一个经典的的开源库,我觉得还是有必要认识一下. 打开github上的网址:https://github.com/chrisbanes ...