Spark Streaming 实现原理

Spark Streaming 实现思路

Spark Streaming 与 Spark Core 的关系可以用下面的经典部件图来表述:


Spark Streaming 实现原理_第1张图片

可以看到Spark Streaming 是建立在Spark Core基础上的,所以DStream也是基于RDD,查看DStream源码发现一句注释:

  • A Discretized Stream (DStream), the basic abstraction in Spark Streaming, is a continuous sequence of RDDs (of the same type) representing a continuous stream of data (seeorg.apache.spark.rdd.RDD in the Spark core documentation for more details on RDDs).

DStream三大特性

  • A list of other DStreams that the DStream depends on
  • A time interval at which the DStream generates an RDD
  • A function that is used to generate an RDD after each time interval

DStream处理数据流程

例如我们有一小块数据处理


Spark Streaming 实现原理_第2张图片
image.png

使用spark streaming 对数据分批切片处理,分为不同batch,因为rdd不可变性,会产生多个rdd相互同构依赖,这也是DStream的特性之一。


Spark Streaming 实现原理_第3张图片
image.png

将数据通过静态模版构造多个批次
Spark Streaming 实现原理_第4张图片
image.png

接下来要考虑元数据的生成和导入以及容错


Spark Streaming 实现原理_第5张图片
image.png

Spark Streaming 模块图


Spark Streaming 实现原理_第6张图片
image.png

1.DStream通过RDD构建DAG,DStreamGraph通过DStream构成。
2.JobScheduler负责调度,每个任务运行后会产生一个JobScheduler,随着用户调用start运行起来,其中包括JobGenerator和RecceiverTracker。一个负责任务生成,一个负责收集元数据信息。
JobGenerator 维护了一个定时器,周期就是 batchDuration,定时为每个 batch 生成 RDD DAG 的实例。具体的,每次 RDD DAG 实际生成包含 5 个步骤:

(1) 要求 ReceiverTracker 将目前已收到的数据进行一次 allocate,即将上次 batch 切分后的数据切分到到本次新的 batch 里;
(2) 要求 DStreamGraph 复制出一套新的 RDD DAG 的实例,具体过程是:DStreamGraph 将要求图里的尾 DStream 节点生成具体的 RDD 实例,并递归的调用尾 DStream 的上游 DStream 节点……以此遍历整个 DStreamGraph,遍历结束也就正好生成了 RDD DAG 的实例;
(3) 获取第 1 步 ReceiverTracker 分配到本 batch 的源头数据的 meta 信息;
(4) 将第 2 步生成的本 batch 的 RDD DAG,和第 3 步获取到的 meta 信息,一同提交给 JobScheduler 异步执行;
(5) 只要提交结束(不管是否已开始异步执行),就马上对整个系统的当前运行状态做一个 checkpoint。
3.ReciverTracker分发Reciver到Executor上,每个 ReceiverSupervisor 启动后将马上生成一个用户提供的 Receiver 实现的实例 —— 该 Receiver 实现可以持续产生或者持续接收系统外数据,比如 TwitterReceiver 可以实时爬取 twitter 数据 —— 并在 Receiver 实例生成后调用 Receiver.onStart();Receiver 在 onStart() 启动后,就将持续不断地接收外界数据,并持续交给 ReceiverSupervisor 进行数据转储,这里 Spark Streaming 目前支持两种成块存储方式,一种是由 BlockManagerBasedBlockHandler 直接存到 executor 的内存或硬盘,另一种由 WriteAheadLogBasedBlockHandler 是同时写 WAL(4c) 和 executor 的内存或硬盘,每次成块在 executor 存储完毕后,ReceiverSupervisor 就会及时上报块数据的 meta 信息给 driver 端的 ReceiverTracker;这里的 meta 信息包括数据的标识 id,数据的位置,数据的条数,数据的大小等信息;ReceiverTracker 再将收到的块数据 meta 信息直接转给自己的成员 ReceivedBlockTracker,由 ReceivedBlockTracker 专门管理收到的块数据 meta 信息。

你可能感兴趣的:(Spark Streaming 实现原理)