本系列主要描述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...

至此,就大致梳理了一下整体流程。

接下来再详细的撸一下每一步的源码。

Spark Streaming源码运行流程解析

reference

《图解Spark核心技术与案例实战》,首先推荐一下这本书,对于理解Spark有很大帮助。

https://www.cppentry.com/bencandy.php?fid=116&id=209107,这个是Spark Streaming源码解析的系列文章,讲的也很清晰

http://ddrv.cn/a/250847 Spark Streaming运行架构图来源



个人公众号:码农峰,定时推送行业资讯,持续发布原创技术文章,欢迎大家关注。

Spark Streaming运行流程及源码解析(一)的更多相关文章

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

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

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

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

  3. Android 全面插件化 RePlugin 流程与源码解析

    转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...

  4. grunt源码解析:整体运行机制&grunt-cli源码解析

    前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分 ...

  5. HDFS追本溯源:HDFS操作的逻辑流程与源码解析

    本文主要介绍5个典型的HDFS流程,这些流程充分体现了HDFS实体间IPC接口和stream接口之间的配合. 1. Client和NN Client到NN有大量的元数据操作,比如修改文件名,在给定目录 ...

  6. Spark Streaming updateStateByKey和mapWithState源码解密

    本篇从二个方面进行源码分析: 一.updateStateByKey解密 二.mapWithState解密 通过对Spark研究角度来研究jvm.分布式.图计算.架构设计.软件工程思想,可以学到很多东西 ...

  7. Spark Core 1.3.1源码解析及个人总结

    本篇源码基于赵星对Spark 1.3.1解析进行整理.话说,我不认为我这下文源码的排版很好,不能适应的还是看总结吧. 虽然1.3.1有点老了,但对于standalone模式下的Master.Worke ...

  8. spark内存管理器--MemoryManager源码解析

    MemoryManager内存管理器 内存管理器可以说是spark内核中最重要的基础模块之一,shuffle时的排序,rdd缓存,展开内存,广播变量,Task运行结果的存储等等,凡是需要使用内存的地方 ...

  9. [Spark內核] 第42课:Spark Broadcast内幕解密:Broadcast运行机制彻底解密、Broadcast源码解析、Broadcast最佳实践

    本课主题 Broadcast 运行原理图 Broadcast 源码解析 Broadcast 运行原理图 Broadcast 就是将数据从一个节点发送到其他的节点上; 例如 Driver 上有一张表,而 ...

随机推荐

  1. 【JDBC】Java程序的数据库初体验

    JDBC是什么 JDBC是一种能够用来执行SQL语句的Java API[接口]. 它是Java提供的一种规范,让各大数据库厂商遵循此规范完成自己的数据库连接驱动[实现接口]. JDBC的入门程序(这里 ...

  2. asp.net core 3.x 通用主机是如何承载asp.net core的-上

    一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...

  3. Spring Cloud(一):服务注册中心Eureka

    Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的 ...

  4. Asp.Net Core 学习教程1、初始.Net Core与VS Code 第一个web程序

    1..Net Core介绍 .NET Core是.NET Framework的新一代版本, 是微软开发的第一个具有跨平台(Windows.Macosx.Linux) 能力的应用程序开发框架,未来也将会 ...

  5. graphviz 的使用教程

    node 节点属性如下 : Name Default Values color black node shape color comment   any string (format-dependen ...

  6. Pycharm 中的翻译工具

    对于开发来说,大多数哥们英文欠缺,比如在下,我们大多数使用的开发工具是IDEA,IDEA 很强大,开发起来顺手. 废话不多说,让我们看一下如何使用翻译器. 打开Pycharm 的setting 设置, ...

  7. 公文流转系统v0.1

    河北金力集团公文流转系统 1.项目需求: 河北金力集团是我省机械加工的龙头企业,主要从事矿山机械制造及各种机械零部件加工.企业有3个厂区,主厂区位于省高新技术开发区,3个分厂分别在保定.邢台和唐山.为 ...

  8. 前端开发利器 Web Replay

    前端开发人员收到测试发来的 bug 后,通常比较头疼复现的问题. 即使测试人员录了视频,照着一步步操作也不一定能复现,例如bug是与当时的数据相关的. 为了解决这个问题,Firefox 推出了一个重磅 ...

  9. KMP——强大的next数组

    \(KMP\) 的原理不在这里仔细讲了,主要说说最近刷题总结出的 \(next\) 数组的强大功能. 部分例题来自<信息学奥赛一本通>的配套练习. 基于定义--字符串相同前后缀 " ...

  10. Python的Excel操作及数据可视化

    Excel表操作 python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 安装xlrd pip install xlrd 简单的表格读取 ...