美文网首页python机器学习爬虫
Spark Streaming 实现原理

Spark Streaming 实现原理

作者: 灯火gg | 来源:发表于2019-04-28 10:06 被阅读60次

    Spark Streaming 实现思路

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


    可以看到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处理数据流程

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


    image.png

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


    image.png
    将数据通过静态模版构造多个批次
    image.png

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


    image.png

    Spark Streaming 模块图


    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 实现原理

        本文链接:https://www.haomeiwen.com/subject/dkhlnqtx.html