本文基于 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 和其他组件,定义了一些接口,然后 ReceiverSupervisorImplReceiverSupervisor 的具体实现,主要实现了协调其他组件(包括 ReceivedBlockHandlerBlockGenerator 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_sample.png

整个 Receiver 端的详细代码结构图如下所示
Receiver.png

思考

  1. 为什么需要将 ReceiverReceiverSupervisor 进行分开呢,下面提供这两个类的函数对比图(其中第一列表示 Receiver 的所有函数;后面几列表示 ReceiverSupervisor 的所有函数,同一行的函数表示有相Receiver_ReceiverSupervisor.png

Comments