![](https://i-blog.csdnimg.cn/blog_migrate/6260eaa5623c16ffe9c4107044488ee1.png)
本文将详细解析ReceiverTracker的的架构设计和具体实现
一、ReceiverTracker的主要功能
ReceiverTracker的主要功能有:
1.
在Executor上启动Receivers
2.
接受Receiver的注册
3.
借助ReceivedBlockTracker来管理Receiver接收数据的元数据
4.
接受Receiver发送的各种消息,并作相应处理
5.
更新Receiver接收数据的速率(也就是限流)
6.
不断的等待Receivers的运行状态,只要Receivers停止运行,就重新启动Receiver。也就是Receiver的容错功能。
7.
停止Receivers
8.
汇报Receiver发送过来的错误信息
二、
ReceiverTracker具体功能详解
2.1 启动receiver并管理receiver接收数据的元数据
首先,
ReceiverTracker内部有一个
ReceiverTrackerEndPoint通讯体endpoint变量,endpoint用来和Receiver和
ReceiverTracker本身进行消息通讯。这个
ReceiverTrackerEndPoint通讯体在ReceiverTracker启动时被初始化:
![](http://images2015.cnblogs.com/blog/592648/201605/592648-20160528123112819-818226361.png)
ReceiverTracker启动Receiver时候,向
ReceiverTrackerEndPoint
通讯体endpoint变量发送了StartAllReceivers(receivers)消息:
![](https://i-blog.csdnimg.cn/blog_migrate/4df864442fff6a176bd782aca483b228.png)
Receiver启动后会向
ReceiverTracker注册,告诉
ReceiverTracker自己启动成功:
![](https://i-blog.csdnimg.cn/blog_migrate/5b91eb121fe655f13715359f29d38086.png)
代码中的trackerEndpoint就是
ReceiverTracker中
ReceiverTrackerEndPoint
通讯体endpoint的引用。
Receiver会不断将接收的数据封装成Block,并将这些Block推送给BlockManager管理,在
将这些Block推送给BlockManager之后,ReceiverSupervisor会将Block的元信息发送给
ReceiverTracker的endpoint:
![](https://i-blog.csdnimg.cn/blog_migrate/5d6275b490d6469b0a9e00793ab6c8e7.png)
可以看到
ReceiverSupervisor向
ReceiverTracker的endpoint发送了AddBlock(blockInfo)消息:
ReceiverTracker收到
AddBlock(blockInfo)消息后
,会启动一个线程进行处理:
![](https://i-blog.csdnimg.cn/blog_migrate/70e1a866d597824a3774a14dc0e46207.png)
ReceiverTracker收到
AddBlock(blockInfo)消息后,调用了addBlock(receiveedBlockInfo)方法进行处理,下面是
addBlock的
源码:
![](https://i-blog.csdnimg.cn/blog_migrate/006c20dcc384bfbdd9c093e1a538f019.png)
这里其实调用了receivedBlockTracker的addBlock方法,receivedBlockTracker是R
eceivedBlockTracker对象,它是在
ReceiverTracker实例化时候被创建:
![](https://i-blog.csdnimg.cn/blog_migrate/17bfc5b19a3aa818267e3a0e5afde4c6.png)
下面看一下ReceivedBlockTracker的
addBlock方法:
![](https://i-blog.csdnimg.cn/blog_migrate/3737e8e267ace5e7581d40c2d2de504f.png)
可以看到
ReceivedBlockTracker的
addBlock方法将block的元信息添加到了一个队队列中,最终是添加到一个叫做
streamIdToUnallocatedBlockQueues
的HashMap中,其中key是streamId,值是该streamid对应的block队列。
![](https://i-blog.csdnimg.cn/blog_migrate/f094c24c94700f4b2f8cae3b8e3c9a0f.png)
2.2 为Batch分配Block
当spark streaming应用程序动态生成job的时候,JobGenerator会调用generateJobs方法,在该方法中会为批处理分配已经接收的Block
![](https://i-blog.csdnimg.cn/blog_migrate/af664bf5326ef6bc506e500d740ea6d5.png)
这里调用了jobScheduler中receiverTracker的allocatedBlockToBatch方法,这里的
receiverTracker就是R
eceiverTracker对象,下面看一下该方法的实现:
![](https://i-blog.csdnimg.cn/blog_migrate/0f0a8987f06ff6c84ecacb1772bb8f69.png)
可以看到,最终调用了ReceivedBlockTracker的
allocatedBlockToBatch方法:
![](https://i-blog.csdnimg.cn/blog_migrate/089ccd48193d5c16f8e263cbf1d56ef9.png)
这里先根据streamId,从
streamIdToUnallocatedBlockQueues中取出接收到的block队列,并将streamId和block队列封装成AllocatedBlocks,最后根据batchTime将其对应的
AllocatedBlocks对象加入timeToAllocatedBlocks中,
timeToAllocatedBlocks是一个HashMap:
![](https://i-blog.csdnimg.cn/blog_migrate/6f8fa8fd570a6dffaad5e6dee94d4104.png)
这样Batch的Block就分配完成。
2.3 ReceiverTracker处理的其他消息
ReceiverTracker中
ReceiverTrackerEndpoint的receive方法定义了各种消息的处理逻辑:
(
1) 收到StartAllReceivers(receivers)消息后,
ReceiverTracker会为receivers分配executor,并在executor上启动相应的receiver
![](https://i-blog.csdnimg.cn/blog_migrate/0c479f7216f8371b76d6016fd802bcde.png)
(2)当
ReceiverTracker监控到
receiver退出返回时,会给
ReceiverTrackerEndpoint发送RestartTracker(receiver)消息。收到该消息后,会重新为receiver分配executor启动
receiver(如果原来的executor运行正常就在原先的executor上重新启动,否则重新调度executor)。
![](https://i-blog.csdnimg.cn/blog_migrate/3257f8abbcbd126fa30bee5a6d5ee7b9.png)
(3)当Spark Streaming 的job结束后,JobScheduler会调用handleJobCompletion方法,最终会调用
cleanupOldBlocksAndBatches
方法给endpoint发送CleanupOldBlocks消息:
![](https://i-blog.csdnimg.cn/blog_migrate/c34fb02b544c245dc71f805ef5a389dc.png)
收到该消息后,会被路由到Receiver 进行Block的清理。
(4)
UpdateReceiverRateLimit消息
![](https://i-blog.csdnimg.cn/blog_migrate/14c1146a38ed7a80f16e354f85b2dbc7.png)
收到
UpdateReceiverRateLimit消息后,会将其路由到receiver,当receiver收到该消息后会调用BlockGenerator的update方法更新Block生成速率。
原创文章,转载请注明:转载自 听风居士博客(http://blog.csdn.net/zhouzx2010) ,否则将追究其法律责任