Spark 定制版~Spark Streaming(二)

本讲内容:

a. 解密Spark Streaming运行机制

b. 解密Spark Streaming架构

注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解。

上节回顾:

上节课谈到技术界的寻龙点穴,Spark就是大数据的龙脉,而Spark Streaming就是Spark的穴位。假如要构建一个强大的Spark应用程序 ,Spark Streaming 是一个值得借鉴的参考,Spark Streaming涉及多个job交叉配合,几乎可以包括spark的所有的核心组件,如果对Spark Streaming精通了的话,可以说就精通了整个Spark,因此精通并掌握Spark Streaming是至关重要的。

在Spark官网(这里写链接内容)中,可以看到如下图所示:

Spark Core上面有4个流行的框架:Spark SQL、Spark Streaming、机器学习、图计算。除了Spark Streaming,其他的子框架大多都是在Spark Core上对一些算法或者接口进行了高层的封装。例如Spark SQL 封装了SQL语法,主要功能就是将SQL语法解析成Spark Core的底层API。而机器学习则是封装了许多的数学向量及算法。GraphX目前也没有太大的更新。

而Spark Streaming更像是对Spark Core的衍生子框架,可想而知,他是相当复杂的一个应用程序。同时我们也不难发现,基于Spark Core的时候,都是基于RDD编程,Spark Streaming则是基于DStream编程。DStream是逻辑级别的,而RDD是物理级别的。DStream是随着时间的流动内部将集合封装RDD。对DStream的操作,转过来对其内部的RDD操作。

我们查看上一节中Spark Streaming的运行日志,就可以看出和RDD的运行几乎是一致的:

SparkStreaming Job在运行的时候,首先会生成DStream的Graph,在特定的时间将DStream Graph转换成RDD Graph。然后再去运行RDD的job 。如下图:

从这个角度来讲,可以将Spark Streaming放在坐标系中。其中Y轴就是对RDD的操作,RDD的依赖关系构成了整个job的逻辑,而X轴就是时间。随着时间的流逝,固定的时间间隔(Batch Interval)就会生成一个job实例,进而在集群中运行。

由此为大家详细总结并揭秘 Spark Streaming五大核心特征

特征1:逻辑管理

DStream是对RDD封装的集合,作用于DStream的操作会对其中每个RDD进行作用,DStream Graph就是RDD Graph的模板,其逻辑管理完全继承RDD的DAG关系。

特征2:时间管理

Spark Streaming的最大特征是引入了时间属性,DStream在RDD的基础上增加了时间纬度,随着时间的纬度,不断把模板实例化,通过动态Job控制器运行作业。

特征3:流式输入和输出

以InputStream和OutputStream为核心,进行流式的数据输入输出。

特征4:高容错

具体Job运行在Spark Cluster之上,此时系统容错就至关重要。

主要思路:

a、限流

b、根据需要调整资源安排

特征5:事务处理

在处理出现崩溃的情况下确保Exactly once的事务语义。主要通过检查点等技术实现。(下一讲再细说)

结合Spark Streaming源码进一步解析:

StreamingContext方法中调用JobScheduler的start方法(StreamingContext.scala,610行代码)

JobGenerator的start方法中,调用startFirstTime方法,来开启定时生成Job的定时器

JobScheduler.scala,83行代码

JobGenerator.scala,98行代码

startFirstTime方法,首先调用DStreamGraph的start方法,然后再调用RecurringTimer的start方法。

JobGenerator.scala,193行代码

DStreamGraph.scala,39行代码

RecurringTimer.scala,59行代码

timer对象为一个定时器,根据batchInterval时间间隔定期向EventLoop发送GenerateJobs的消息。

JobGenerator.scala,58~59行代码

接收到GenerateJobs消息后,会回调generateJobs方法。

JobGenerator.scala,181行代码

generateJobs方法再调用DStreamGraph的generateJobs方法生成Job

JobGenerator.scala,248行代码

DStreamGraph.scala,248行代码

DStreamGraph的实例化是在StreamingContext中的

(StreamingContext.scala,162~164行代码)

在DStreamGraph的类中还保存了输入流和输出流的信息

(DStreamGraph.scala,29~30行代码)

DStream类中依赖、计算、保存RDD信息

(DStream.scala,74、77、85行代码)

回到JobGenerator的start方法中receiverTracker.start()

源码解密总结:

1,当调用StreamingContext的start方法时,启动了JobScheduler

2,当JobScheduler启动后会先后启动ReceiverTracker和JobGenerator

3,ReceiverTracker启动后会创建ReceiverTrackerEndpoint这个消息循环体,来接收运行在Executor上的Receiver发送过来的消息

4,ReceiverTracker在启动时会给自己发送StartAllReceivers消息,自己接收到消息后,向Spark提交startReceiverFunc的Job

5,startReceiverFunc方法中在Executor上启动Receiver,并实例化ReceiverSupervisorImpl对象,来监控Receiver的运行

6,ReceiverSupervisorImpl对象会调用Receiver的onStart方法,我们以SocketReceiver为例,启动一个线程,连接Server,读取网络数据先调用ReceiverSupervisorImpl的pushSingle方法,

保存在BlockGenerator对象中,该对象内部有个定时器,放到阻塞队列blocksForPushing,等待内部线程取出数据放到BlockManager中,并发AddBlock消息给ReceiverTrackerEndpoint。

ReceiverTrackerEndpoint为ReceiverTracker的内部类,在接收到addBlock消息后将streamId对应的数据阻塞队列streamIdToUnallocatedBlockQueues中

7,JobGenerator启动后会启动以batchInterval时间间隔发送GenerateJobs消息的定时器

8,接收到GenerateJobs消息会先后触发ReceiverTracker的allocateBlocksToBatch方法和DStreamGraph的generateJobs方法

9,ReceiverTracker的allocateBlocksToBatch方法会调用getReceivedBlockQueue方法从阻塞队列streamIdToUnallocatedBlockQueues中根据streamId获取数据

10,DStreamGraph的generateJobs方法,继而调用变量名为outputStreams的DStream集合的generateJob方法

11,继而调用DStream的getOrCompute来调用具体的DStream的compute方法,我们以ReceiverInputDStream为例,compute方法是从ReceiverTracker中获取数据

经典直说:

  在空间维度上的业务逻辑作用于DStream,随着时间的流逝,每个Batch Interval形成了具体的数据集,产生了RDD,对RDD进行transform操作,进而形成了RDD的依赖关系RDD DAG,形成job。然后jobScheduler根据时间调度,基于RDD的依赖关系,把作业发布到Spark Cluster上去运行,不断的产生Spark作业。

备注:

1、DT大数据梦工厂微信公众号DT_Spark

2、Spark大神级专家:王家林

3、新浪微博: http://www.weibo.com/ilovepains

时间: 2024-10-17 11:03:46

Spark 定制版~Spark Streaming(二)的相关文章

Spark 定制版:004~Spark Streaming事务处理彻底掌握

本讲内容: a. Exactly Once b. 输出不重复 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾: 上节课通过案例透视了Spark Streaming Job架构和运行机,并结合源码进行了详细解说:同时也了解了Spark Streaming Job的容错机制,包括 Executor 与 Driver两方面的容错机制. 也就是说Job的事务处理,主要是在Executor 与 Driver两个应用中展开 开讲 首先,我们必须知道什么

Spark定制版2:通过案例对SparkStreaming透彻理解三板斧之二

本节课主要从以下二个方面来解密SparkStreaming: 一.解密SparkStreaming运行机制 二.解密SparkStreaming架构 SparkStreaming运行时更像SparkCore上的应用程序,SparkStreaming程序启动后会启动很多job,每个batchIntval.windowByKey的job.框架运行启动的job.例如,Receiver启动时也启动了job,此job为其他job服务,所以需要做复杂的spark程序,往往多个job之间互相配合.SparkS

Spark 定制版:016~Spark Streaming源码解读之数据清理内幕彻底解密

本讲内容: a. Spark Streaming数据清理原因和现象 b. Spark Streaming数据清理代码解析 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上一讲中,我们之所以用一节课来讲No Receivers,是因为企业级Spark Streaming应用程序开发中在越来越多的采用No Receivers的方式.No Receiver方式有自己的优势,比如更大的控制的自由度.语义一致性等等.所以对No Receivers方

Spark定制版1:通过案例对SparkStreaming透彻理解三板斧之一

本节课通过二个部分阐述SparkStreaming的理解: 一.解密SparkStreaming另类在线实验 二.瞬间理解SparkStreaming本质 Spark源码定制,自己动手改进Spark源码,通常在电信.金融.教育.医疗.互联网等领域都有自己不同的业务,如果Sprak官方版本没有你需要的业务功能,你自己可以定制.扩展Spark的功能,满足公司的业务需要. 选择SparkStreaming框架源码研究.二次开发的原因 1.Spark起初只有Spark Core基础框架没有其他的子框架(

Spark 定制版:005~贯通Spark Streaming流计算框架的运行源码

本讲内容: a. 在线动态计算分类最热门商品案例回顾与演示 b. 基于案例贯通Spark Streaming的运行源码 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上节课主要从事务视角为大家探索Spark Streaming架构机制:Spark Streaming程序分成而部分,一部分是Driver,另外一部分是Executor.通过对Driver和Executor解析,洞察怎么才能完成完整的语义.事务一致性,并保证数据的零丢失,Exa

Spark 定制版:009~Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

本讲内容: a. Receiver启动的方式设想 b. Receiver启动源码彻底分析 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上一讲中,我们给大家具体分析了RDD的物理生成和逻辑生成过程,彻底明白DStream和RDD之间的关系,及其内部其他有关类的具体依赖等信息: a. DStream是RDD的模板,其内部generatedRDDs 保存了每个BatchDuration时间生成的RDD对象实例.DStream的依赖构成了RDD

Spark 定制版:003~Spark Streaming(三)

本讲内容: a. Spark Streaming Job 架构和运行机制 b. Spark Streaming Job 容错架构和运行机制 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾: 上节课谈到Spark Streaming是基于DStream编程.DStream是逻辑级别的,而RDD是物理级别的.DStream是随着时间的流动内部将集合封装RDD.对DStream的操作,归根结底还是对其RDD进行的操作. 如果将Spark Stre

Spark 定制版:008~Spark Streaming源码解读之RDD生成全生命周期彻底研究和思考

本讲内容: a. DStream与RDD关系的彻底的研究 b. Streaming中RDD的生成彻底研究 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上节课,我们重点给大家揭秘了JobScheduler内幕:可以说JobScheduler是整个Spark Streming的调度的核心,其地位相当于Spark Core中的DAGScheduler. JobScheduler是SparkStreaming 所有Job调度的中心,内部有两个重

Spark 定制版:007~Spark Streaming源码解读之JobScheduler内幕实现和深度思考

本讲内容: a. JobScheduler内幕实现 b. JobScheduler深度思考 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上节课,我们以JobGenerator类为重心,为大家左右延伸,解密Job之动态生成:并总结出了Job之动态生成的三大核心: a. JobGenerator: 负责Job生成 b. JobSheduler:负责Job调度 c. ReceiverTracker:获取元数据 如Job动态生成图: 开讲 由上