zoukankan      html  css  js  c++  java
  • Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

    本期内容 :

    • 数据接收架构设计模式
    • 数据接收源码彻底研究

    一、Spark Streaming数据接收设计模式  

      Spark Streaming接收数据也相似MVC架构:

      1、 Mode相当于Receiver存储数据,C级别的,Receiver是个抽象因为他有好多的Receiver

      2、 ReceiverSupervisor 是控制器,因为Receiver启动是靠ReceiverSuperior启动的,及接收到的数据交给ReceiverSuperior存储数据的

      3、 Driver会获得源数据,即获得界面,操作的时候是通过界面再操作底层的业务逻辑(拿到了源数据,实质上就是操作了真正数据,即界面)

      基于Reverse的角度考虑,Spark Streaming接收数据首先会有个循环器,循环器会不断的次序接收数据,接收到数据后需要存储数据,存储完成数据需要汇报给Driver,接收到数据如果不向Driver汇报的话,Driver在调度的时候可能就不会把接收到的数据计入调度任务中,当Driver接收到接收源数据的相关信息,如 ID、分片等内容,Driver会根据具体数据情况分配Job,Driver本身就是基于原有数据来构造出来的,并分配资源的。

    二、 Spark Streaming数据接收源码

      ReceiverTracker是通过发送一个又一个的Job,每个Job只有一个的Teark,每个Teark里面只有ReceiverSupervisor 以函数功能角度启动每一个Receiver的。

     

     

     

      LaunchReceivers处理流程源码 :

     

     

     

     

     

     确认数据到达ReceiverTracker

     

     

     

      Receiver的产生源码 : 

       

       

       

       

       

      专门为创建Receiver而做的RDD源码 :

       

       

       

      ReceiverSupervisor数据存储源码 :

       Receiver接收到的数据会给ReceiverSupervisor ,然后ReceiverSupervisor存储数据再把信息汇报给ReceiverTracker(其实是汇报给RPC)。

       

       两个构造器 :

       

       

      

      SetupEndpoint 消息循环体源码:

       

       

       

       

        

      Start启动接收数据 源码 :

       

       

       

       

      数据传入Buffer 并更新到Block 源码 :

       

       

       

       

      

      把Receiver接收到的数据生成以Batches的类型存在就是Block的形式存在,并存储在适当的地方以特定的频率启动两条线程:

      1、 一条线程专门把Receiver接收到的数据合并成Block

      2、 另外一条就是把数据合并后的Block提交给manager去存储

      上层框架存储数据需要通过manager去存储,不要在Receiver中启动BlockGenerator ,担心有延迟来不及处理你的数据,可能Receiver存储数据时会报错。

      限流BlockGenerator是继承RateLimiter ,不能直接限定流入的数据,但是可以限定存储的数据流速度,相当于限定了流动的数据。

      BlockGenerator是由CreateBlockGenerator产生的 :

       

       

       

       

      

      StartReceiver 接收数据与存储数据源码 :

       

       

       

       进入Start方法会有不同类型分别进行启动,

       

       系统调用这个函数必须初始化所有资源包括线程、Buffer来接收数据,而且必须是非阻塞的,存储数据的话需要调用Spark的Store

       

       

       

       

       

       

       

        

        根据时间频率生成一个个的Block,并把数据不断合并起来的

        

        

        

        

        

        

        

        

        

  • 相关阅读:
    获取汉字信息(结合正则就可以得到想要的详细啦)
    压缩图片(递归结合pillow)通过改变图片尺寸实现;tinify 需要付费
    实现两个视频同时播放,利用到opencv模块 (线程进程开启)
    切换pip下载源头
    516. 最长回文子序列
    87.扰乱字符串
    Maximum Likelihood ML
    数组右边第一个比当前元素大的数
    4. 寻找两个正序数组的中位数
    min-hash
  • 原文地址:https://www.cnblogs.com/yinpin2011/p/5521648.html
Copyright © 2011-2022 走看看