Streaming 中 Receiver 相关源码分析
本文基于 spark 1.6.2
本次的源码全来自 org.apache.spark.streaming.receiver
这个 package 下,包括 BlockGenerator.scala
, RateLimiter
, ReceiverdBlock.scala
, ReceivedBlockHandler.scala
, Receiver.scala
, ReceiverSupervisor.scala
, ReceiverSupervisorImpl.scala
其中 Receiver
是所有接受数据的父类,主要定义一些接口,用户只需要继承 Receiver
,然后实现其中的接口就行。
ReceiverSupervisor
则是负责和协调 Receiver
和其他组件,定义了一些接口,然后 ReceiverSupervisorImpl
是 ReceiverSupervisor
的具体实现,主要实现了协调其他组件(包括 ReceivedBlockHandler
和 BlockGenerator
BlockGeneratorListener
以及远端 RPC 服务等)和 Receiver
的逻辑。
BlockGenerator
则主要负责接受 Receiver
接受到的数据,然后存储成 block(具体的有 ReceivedBlockHandler
负责),会起两个线程来做相应的事情,一个是定时的将接受到的数据生成 block,一个是将 block push 给 ReceivedBlockHandler
进行存储,具体的 block 管理则通过 Spark core 的 block 模块来进行管理。
ReceivedBlockHandler
则负责将 block 保存到具体的地方,包括指定的 storageLevel 以及 write ahead log。
整个 Receiver 端的代码结构简化版如下所示,其中 Receiver 包含一个 ReceiverSupervisor 对象,ReceiverSupervisor 负责和 BlockGenerator 以及 ReceivedBlockHandler 交互。用户继承 Receiver,实现具体的接受数据的逻辑即可,对于数据接受之后,怎么处理,都通过 ReceiverSupervisor 中转给 BlockGenerator 来处理(BlockGenerator 会有一个定时器用于生成 block,还有一个单独的线程用于将生成的 block push 给 BlockManager)
整个 Receiver 端的详细代码结构图如下所示
思考
- 为什么需要将
Receiver
和ReceiverSupervisor
进行分开呢,下面提供这两个类的函数对比图(其中第一列表示Receiver
的所有函数;后面几列表示ReceiverSupervisor
的所有函数,同一行的函数表示有相