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,从而取到数据

posted on 2014-03-07 18:08  fxjwind  阅读(2141)  评论(4编辑  收藏  举报