zoukankan      html  css  js  c++  java
  • Spark Streaming源码分析 – InputDStream

    对于NetworkInputDStream而言,其实不是真正的流方式,将数据读出来后不是直接去处理,而是先写到blocks中,后面的RDD再从blocks中读取数据继续处理
    这就是一个将stream离散化的过程
    NetworkInputDStream就是封装了将数据从source中读出来,然后放到blocks里面去的逻辑(Receiver线程)
    还需要一个可以管理NetworkInputDStream,以及把NetworkInputDStream.Receiver部署到集群上执行的角色,这个就是NetworkInputTracker
    NetworkInputTracker会负责执行一个独立的job,把各个Receiver以RDD的task的形式,分布到各个worknode上去执行

    InputDStream

     

    NetworkInputDStream

    NetworkInputDStream是比较典型的Input,主要接口两个
    getReceiver,Receiver对于NetworkInputDStream是最关键的,里面封装了如果从数据源读到数据,如果切分并写到blocks中去
    compute,由于Receiver只会把数据写到blocks中去,问题我们如何取到这些数据了?
    Receiver在写block的同时,会发event给networkInputTracker注册block
    所以NetworkInputDStream.compute是无法直接算出数据来,而是先从networkInputTracker查询出blockids,并从BlockManager中读出数据


    NetworkReceiver

    NetworkReceiverActor
    用于将Receiver的event转发给TrackerActor

    BlockGenerator
    3个关键的接口,
    +=,用于调用者将数据不断加到currentBuffer上
    updateCurrentBuffer,定时将currentBuffer的数据,生成block对象放到blocksForPushing队列上(blockIntervalTimer调用)
    keepPushingBlocks, 不断将
    blocksForPushing队列上的blocks取出,并写到blockmanager中去(blockPushingThread调用)

     

    SocketInputDStream

    Socket作为最为典型的NetworkInputDStream,看看是如何实现的
    对于SocketInputDStream,关键实现getReceiver接口,可以获取SocketReceiver对象
    而对于SocketReceiver关键是实现onStart接口,将从socket上读到的数据写到blockGenerator的currentBuffer上

    NetworkInputTracker

    NetworkInputTracker用于管理和监控所有的NetworkInputDStream
    首先NetworkInputTrackerActor,可以从NetworkInputDStream接收RegisterReceiver,AddBlocks,和DeregisterReceiver事件
    从而知道有多少NetworkInputDStream,并且每个读取并存储了多少的blocks

    再者,在ReceiverExecutor中他负责启动所有NetworkInputDStream的Receivers,做法比较奇特,也是依赖于RDD
    将每个receiver封装在RDD的一个partition里,partition会作为一个task被调度,最后runjob去执行startReceiver,这样每个receiver都会在task被执行的时候start

    而外部通过getBlockIds,来取得某NetworkInputDStream所有的blockids,从而取到数据

  • 相关阅读:
    记一个微信公众号个性化菜单的坑
    初学c# -- 学习笔记(六) winfrom组件圆角
    Swift中添加标记(MARK)和警告(TODO FIXME)
    iOS Xib布局某些控件显示或隐藏<约束的修改>
    [!] Unable to satisfy the following requirements:
    React Native使用NetInfo对当前系统网络的判断
    iOS自定义下拉列表
    [!] The version of CocoaPods used to generate the lockfile (1.4.0.beta.1) is higher than the version of the current executable (1.3.0.beta.1). Incompatibility issues may arise.
    iOS实现TextField光标居中
    iOS优秀第三方框架
  • 原文地址:https://www.cnblogs.com/fxjwind/p/3586972.html
Copyright © 2011-2022 走看看