zoukankan      html  css  js  c++  java
  • Spark Streaming揭秘 Day10 从BlockGenerator看接收数据的生命周期

    Spark Streaming揭秘 Day10

    从BlockGenerator看接收数据的生命周期

    昨天主要介绍了SparkStreaming中对于Receiver的生命周期管理,下面让我们进入到Receiver内部,研究下其工作机制。

    首先,先总结下SparkStreaming中接收数据的特点:

    1. 数据需要不间断的按照次序接收
    2. 由于在driver中需要保存元数据,在存储数据之后,需要不断汇报给driver

    让我们进入接收数据关键的BlockGenerator进行分析。

    Block概念

    Block是Spark中非常重要的概念,在receiver接收数据过程中也非常的重要。简单来说,Receiver(以Kafka为例)是一条一条接收数据的,但是出于效率考虑,需要合并为block供后续处理。其操作主要分为三步。

    Step1:数据接收

    会统一将数据放入currentBuffer中,需要注意如果这个时候数据丢失了,就真的丢失了。
    Snip20160516_43

    BlockGenerator中最为关键的是两个线程:
    Snip20160516_39

    线程1. blockIntervalTimer把数据合并为block
    线程2. blockPushingThread把合并后的block通过BlockManager来存储

    Step2:Block生成

    blockIntervalTimer以一个固定间隔生成block(默认200ms)从currentBuffer生成Block,放入blocksForPushing。
    Snip20160516_41

    Step3:Block存储

    blockPushingThread每10ms从blocksForPushing中获取数据,并调用pushBlock进行后续处理。
    Snip20160516_45

    对pushBlock的调用,我们可以跟踪到如下关键代码:
    可以看到主要有两项工作,一是进行数据存储,二是向Driver进行汇报!!!
    Snip20160516_47

    让我们进入存储部分的代码,发现其最终是调用的Spark的BlockManager来进行实际数据的存储。
    Snip20160516_49

    其他

    从ReceiverSupervisor定义的事件中,我们可以发现还有两个比较重要的方法。
    Snip20160516_50

    • cleanupOldBlocks,在每个batch处理完,会根据Driver发送的信息将旧的block清理掉,这也是程序能7*24小时持续运行的保证!!!

    • updateRateLimit,可以动态调整消息接收的速度,实际上,是通过限定存储的速度,来限定流动的速度。

    最后,最重要的:

    从架构角度,我们可以把数据接收模块理解为一个mvc架构。

    • model是Receiver,在底层负责数据的获取。
    • controller是ReceiverSupervisor,主要负责对Receiver的控制,receiver收到数据后,交给ReceiverSupervisor存储数据。
    • view是Driver,其利用元数据对外提供服务,并在需要时通过ReceiverSupervisor调用Receiver获取数据。

    欲知后事如何,且听下回分解

    DT大数据每天晚上20:00YY频道现场授课频道68917580

  • 相关阅读:
    nginx
    vue拦截
    时间转化封装
    Vue粒子特效(vue-particles插件)
    vscode 使用ESLint 自动检查,保存时自动格式化
    小程序请求封装
    common.js
    h5常见
    封装promise
    promise使用
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5499619.html
Copyright © 2011-2022 走看看