Spark Streaming运行流程及源码解析(一)
本系列主要描述Spark Streaming的运行流程,然后对每个流程的源码分别进行解析
之前总听同事说Spark源码有多么棒,咱也不知道,就是疯狂点头。今天也来撸一下Spark源码。
对Spark的使用也就是Spark Streaming使用的多一点,所以就拿Spark Streaming开涮。

源码中的一些类
这里先列举一些源码中的类,大家先预热一下。
StreamingContext:这是Spark Streaming程序的入口,提供了运行时上下文环境
DStream:是RDD在Spark Streaming中的实现,是连续的RDD(相同类型)序列,表示连续的数据流
JobScheduler:生成和调度job
DStreamGraph:保存DStream之间的依赖关系
JobGenerator:根据DStream依赖生成job
ReceiverTracker:Driver端用于管理ReceiverInputDStreams执行的管家
EventLoop:一个事件循环,用于接收来自调用方的事件并处理事件线程中的所有事件。它将启动一个专用事件线程来处理所有事件。内部使用LinkedBlockingDeque实现。
RecurringTimer:相当于一个定时器,定时执行某个函数
ReceiverSupervisor:Executor端管理Receiver的管家
Receiver:在Executor节点上运行以接收外部数据。
InputDStream:接收外部数据
ReceiverInputDStream:用于定义必须在工作节点上启动接收器以接收外部数据的类,可以通过它获得Receiver
BlockGenerator:根据时间间隔将接收到的数据生成块
RpcEndpoint:RPC终端点,Spark Streaming中使用Netty进行RPC通信
ReceiverTrackerEndpoint:Driver端的ReceiverTracker终端,用于和Receiver通信
运行流程
Spark Streaming运行时由Driver和Executor相互协调完成。
Driver端创建StreamingContext,其中包含了DStreamGraph和JobScheduler(它又包括了ReceiverTracker和JobGenerator),Driver主要负责生成调度job、与execuor进行交互、指导工作。
Eexcutor主要有ReceiverSupervisor、Receiver、BlockManager、BlockGenerator,Executor负责数据的接收和存储、任务的执行。
以下是Spark Streaming运行架构图,可以先大致看一下,等待会看完运行流程再回来看一遍。

从接收数据到处理完成具体可划分为以下四步:
启动流处理引擎
创建并启动StreamingContext对象,其中维护了DStreamGraph和JobScheduler实例。
DStreamGraph用来定义DStream,并管理他们的依赖关系。
JobScheduler用来生成和调度job,其中维护了ReceiverTracker和JobGenerator实例。
ReceiverTracker是Driver端的Receiver管理者,负责在Executor中启动ReceiverSupervisor并与之通信,ReceiverSupervisor会启动Receiver进行接收消息。
JobGenerator用来生成Job。
每个实例都各司其职,在启动时都会调用其start方法,开始运转。
接收并存储数据
Executor端的Receiver启动后不断的接收消息,并调用其store()方法将数据存储。
store方法最终会调用ReceiverSupervisorImpl.pushAndReportBlock()将数据进行存储,并汇报给Driver端的ReceiverTrackerEndpoint。
这里有一个重要的类:BlockGenerator,其使用ArrayBuffer对接收到的单条数据进行暂存。
BlockGenerator还有一个定时器,按批处理间隔定时将ArrayBuffer中的数据封装为Block,并将Block存到一个ArrayBlockingQueue队列中。
BlockGenerator中还启动了一个线程从ArrayBlockingQueue中取出Block,调用ReceiverSupervisorImpl.pushAndReportBlock()进行存储,并与Driver端汇报。
处理数据
处理数据就是生成job、执行job。
首先在JobGenerator中维护了一个定时器,每当批处理间隔到达时,发起GenerateJobs指令,调用generateJobs生成&执行job。
generateJobs方法中会让ReceiverTracker分配本批次对应的数据,然后让DStreamGraph根据DStream的依赖生成job;job生成成功的话会调用submitJobSet提交执行job,然后执行job。
我们编写的业务处理代理代码,会在生成job时作为参数参进去。
输出数据
job执行后会根据我们写的代码执行输出。
end...
至此,就大致梳理了一下整体流程。
接下来再详细的撸一下每一步的源码。
reference
《图解Spark核心技术与案例实战》,首先推荐一下这本书,对于理解Spark有很大帮助。
https://www.cppentry.com/bencandy.php?fid=116&id=209107,这个是Spark Streaming源码解析的系列文章,讲的也很清晰
http://ddrv.cn/a/250847 Spark Streaming运行架构图来源
个人公众号:码农峰,定时推送行业资讯,持续发布原创技术文章,欢迎大家关注。
Spark Streaming运行流程及源码解析(一)的更多相关文章
- Spark Streaming揭秘 Day26 JobGenerator源码图解
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...
- Spark Streaming揭秘 Day22 架构源码图解
Spark Streaming揭秘 Day22 架构源码图解 今天主要是通过图解的方式,对SparkStreaming的架构进行一下回顾. 下面这个是其官方标准的流程描述. SparkStreamin ...
- Android 全面插件化 RePlugin 流程与源码解析
转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...
- grunt源码解析:整体运行机制&grunt-cli源码解析
前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分 ...
- HDFS追本溯源:HDFS操作的逻辑流程与源码解析
本文主要介绍5个典型的HDFS流程,这些流程充分体现了HDFS实体间IPC接口和stream接口之间的配合. 1. Client和NN Client到NN有大量的元数据操作,比如修改文件名,在给定目录 ...
- Spark Streaming updateStateByKey和mapWithState源码解密
本篇从二个方面进行源码分析: 一.updateStateByKey解密 二.mapWithState解密 通过对Spark研究角度来研究jvm.分布式.图计算.架构设计.软件工程思想,可以学到很多东西 ...
- Spark Core 1.3.1源码解析及个人总结
本篇源码基于赵星对Spark 1.3.1解析进行整理.话说,我不认为我这下文源码的排版很好,不能适应的还是看总结吧. 虽然1.3.1有点老了,但对于standalone模式下的Master.Worke ...
- spark内存管理器--MemoryManager源码解析
MemoryManager内存管理器 内存管理器可以说是spark内核中最重要的基础模块之一,shuffle时的排序,rdd缓存,展开内存,广播变量,Task运行结果的存储等等,凡是需要使用内存的地方 ...
- [Spark內核] 第42课:Spark Broadcast内幕解密:Broadcast运行机制彻底解密、Broadcast源码解析、Broadcast最佳实践
本课主题 Broadcast 运行原理图 Broadcast 源码解析 Broadcast 运行原理图 Broadcast 就是将数据从一个节点发送到其他的节点上; 例如 Driver 上有一张表,而 ...
随机推荐
- JavaScript 继承小记
面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分面向对象的编程语言,都是通过“类”(class) ...
- spring boot中使用freemarker
在做Java web开发领域,web模板引擎主要有jsp.freemarker.velocity,其中freemarker是我们常用的一种,在spring boot中使用的freemarker的方法可 ...
- 单用户登陆demo-后者挤到前者,类似QQ
单用户登陆demo ,采用的是Tp5. 流程是,当用户首次登陆是验证用户帐号密码,成功的,用当前时间戳加上用户id和ip 拼接成一个标识,暂且sign ,然后存入cookie ,时间戳存入缓存redi ...
- 手算CRC及其实现
前言: 这篇文章主要讲的是如何手算CRC以及运用CRC,更侧重方法的步骤,对原理方面不做探讨. 方法也是按照我个人理解的来,所以并不专业~ 一些搬过来的代码我也修改了一下下 如果想了解原理的可参考资料 ...
- Spring中PropertiesLoaderUtils应用
FileSystemResource fileSystemResource =new FileSystemResource("D:/home/conf/mail.properties&quo ...
- vue实现checked 全选功能
记录一下 module.data = { result: {}, items: [] //初始化全选按钮, 默认不选 ,isCheckedAll: false};module.vue = new V ...
- Webpack实战(一):Webpack打包工具安装及参数配置
为什么要模块化 javascript跟其他开发语言有很多的区别,其中一个就是没有模块化概念,如果一个项目中有多个js文件,我们只能通过script标签引入的方式,把一个个js文件插入到页面,这种做法会 ...
- Nginx作为负载均衡——实战演练
配置语法 Syntax:upstream name {...} Default:—— Context:http 演示 准备两台虚拟主机192.168.96.188.192.168.96.188 在18 ...
- svn和 android adt的 eclipse插件更新地址
下边这两个插件的更新地址是每次安装android开发环境时都能用到的,为了方便在这里记录一下. android adt: http://dl-ssl.google.com/android/eclips ...
- [洛谷P1606] [USACO07FEB] 荷叶塘Lilypad Pond
Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...