ReceiverTraker, ReceivedBlockTracker 详解

引言
我们在 [Spark Streaming 实现思路与模块概述](0.1 Spark Streaming 实现思路与模块概述.md) 给出了 模块 3:数据产生与导入 的基本工作流程:

(1) 由 Receiver 的总指挥 ReceiverTracker 分发多个 job(每个 job 有 1 个 task),到多个 executor 上分别启动 ReceiverSupervisor 实例;

(2) 每个 ReceiverSupervisor 启动后将马上生成一个用户提供的 Receiver 实现的实例 —— 该 Receiver 实现可以持续产生或者持续接收系统外数据,比如 TwitterReceiver 可以实时爬取 twitter 数据 —— 并在 Receiver 实例生成后调用 Receiver.onStart()。

(1)(2) 的过程由上图所示,这时 Receiver 启动工作已运行完毕。

接下来 ReceiverSupervisor 将在 executor 端作为的主要角色,并且:

(3) Receiver 在 onStart() 启动后,就将持续不断地接收外界数据,并持续交给 ReceiverSupervisor 进行数据转储;

(4) ReceiverSupervisor 持续不断地接收到 Receiver 转来的数据:

如果数据很细小,就需要 BlockGenerator 攒多条数据成一块(4a)、然后再成块存储(4b 或 4c)

反之就不用攒,直接成块存储(4b 或 4c)

这里 Spark Streaming 目前支持两种成块存储方式,一种是由 blockManagerskManagerBasedBlockHandler 直接存到 executor 的内存或硬盘,另一种由 WriteAheadLogBasedBlockHandler 是同时写 WAL(4c) 和 executor 的内存或硬盘

(5) 每次成块在 executor 存储完毕后,ReceiverSupervisor 就会及时上报块数据的 meta 信息给 driver 端的 ReceiverTracker;这里的 meta 信息包括数据的标识 id,数据的位置,数据的条数,数据的大小等信息。

(6) ReceiverTracker 再将收到的块数据 meta 信息直接转给自己的成员 ReceivedBlockTracker,由 ReceivedBlockTracker 专门管理收到的块数据 meta 信息。

这里 (3)(4)(5)(6) 的过程是一直持续不断地发生的,我们也将其在上图里标识出来。

上面的内容我们已经在 [Receiver 分发详解](3.1 Receiver 分发详解.md) 和 [Receiver, ReceiverSupervisor, BlockGenerator, ReceivedBlockHandler 详解](3.2 Receiver, ReceiverSupervisor, BlockGenerator, ReceivedBlockHandler 详解.md) 中介绍过了。

本文我们详解的是 driver 端的 ReceiverTracker 和 ReceivedBlockTracker在这里插入图片描述
ReceiverTracker 详解
ReceiverTracker 在 Spark 1.5.0 版本里的代码变动比较大,不过其主要功能还是没怎么改变,我们一一来看:

(1) ReceiverTracker 分发和监控 Receiver
ReceiverTracker 负责 Receiver 在各个 executor 上的分发
包括 Receiver 的失败重启

(2) ReceiverTracker 作为 RpcEndpoint
ReceiverTracker 作为 Receiver 的管理者,是各个 Receiver 上报信息的入口
也是 driver 下达管理命令到 Receiver 的出口

(3) ReceiverTracker 管理已上报的块数据 meta 信息

整体来看,ReceiverTracker 就是 Receiver 相关信息的中枢。

(1) ReceiverTracker 分发和监控 Receiver
ReceiverTracker 分发和监控 Receiver 的内容我们已经在 [Receiver 分发详解.md](3.1 Receiver 分发详解.md) 详解过了,我们这里总结一下。

在 ssc.start() 时,将隐含地调用 ReceiverTracker.start();而 ReceiverTracker.start() 最重要的任务就是调用自己的 launchReceivers() 方法将 Receiver 分发到多个 executor 上去。然后在每个 executor 上,由 ReceiverSupervisor 来分别启动一个 Receiver 接收数据。

而且在 1.5.0 版本以来引入了 ReceiverSchedulingPolicy,是在 Spark Streaming 层面添加对 Receiver 的分发目的地的计算,相对于之前版本依赖 Spark Core 的 TaskScheduler 进行通用分发,新的 ReceiverSchedulingPolicy 会对 Streaming 应用的更好的语义理解,也能计算出更好的分发策略。

并且还通过每个 Receiver 对应 1 个 Job 的方式,保证了 Receiver 的多次分发,和失效后的重启、永活。

从本小节 ReceiverTracker 分发和监控 Receiver 的角度,我们对以前版本的 Spark Streaming(以 1.4.0 为代表)、和新版本的 Spark Streaming(以 1.5.0 为代表)有总结对比:在这里插入图片描述
(2) ReceiverTracker 作为 RpcEndpoint
RpcEndPoint 可以理解为 RPC 的 server 端,供 client 调用。

ReceiverTracker 作为 RpcEndPoint 的地址 —— 即 driver 的地址 —— 是公开的,可供 Receiver 连接;如果某个 Receiver 连接成功,那么 ReceiverTracker 也就持有了这个 Receiver 的 RpcEndPoint。这样一来,通过发送消息,就可以实现双向通信。

1.5.0 版本以来,ReceiverTracker 支持的消息有 10 种,我们进行一个总结:在这里插入图片描述
(3) ReceiverTracker 管理块数据的 meta 信息
一方面 Receiver 将通过 AddBlock 消息上报 meta 信息给 ReceiverTracker,另一方面 JobGenerator 将在每个 batch 开始时要求 ReceiverTracker 将已上报的块信息进行 batch 划分,ReceiverTracker 完成了块数据的 meta 信息管理工作。

具体的,ReceiverTracker 有一个成员 ReceivedBlockTracker,专门负责已上报的块数据 meta 信息管理。

ReceivedBlockTracker 详解
我们刚刚讲到,ReceivedBlockTracker 专门负责已上报的块数据 meta 信息管理,但 ReceivedBlockTracker 本身不负责对外交互,一切都是通过 ReceiverTracker 来转发 —— 这里 ReceiverTracker 相当于是 ReceivedBlockTracker 的门面(可参考 门面模式)。

在 ReceivedBlockTracker 内部,有几个重要的成员,它们的关系如下:
streamIdToUnallocatedBlockQueues
维护了上报上来的、但尚未分配入 batch 的 Block 块数据的 meta
为每个 Receiver 单独维护一个 queue,所以是一个 HashMap:receiverId → mutable.Queue[ReceivedBlockInfo]

timeToAllocatedBlocks
维护了上报上来的、已分配入 batch 的 Block 块数据的 meta
按照 batch 进行一级索引、再按照 receiverId 进行二级索引的 queue,所以是一个 HashMap: time → HashMap

lastAllocatedBatchTime
记录了最近一个分配完成的 batch 是哪个

上面是用于状态记录的主要数据结构。对这些状态存取主要是 4 个方法:

addBlock(receivedBlockInfo: ReceivedBlockInfo)
收到某个 Receiver 上报上来的块数据 meta 信息,将其加入到 streamIdToUnallocatedBlockQueues 里

allocateBlocksToBatch(batchTime: Time)
主要是 JobGenerator 在发起新 batch 的计算时,第一步就调用本方法
是将 streamIdToUnallocatedBlockQueues 的内容,以传入的 batchTime 参数为 key,添加到 timeToAllocatedBlocks 里
并更新 lastAllocatedBatchTime

getBlocksOfBatch(batchTime: Time)
主要是 JobGenerator 在发起新 batch 的计算时,由 DStreamGraph 生成 RDD DAG 实例时,将调用本方法
调用本方法查 timeToAllocatedBlocks,获得划入本 batch 的块数据元信息,由此生成处理对应块数据的 RDD

cleanupOldBatches(cleanupThreshTime: Time, …)
主要是当一个 batch 已经计算完成、可以把已追踪的块数据的 meta 信息清理掉时调用
将清理 timeToAllocatedBlocks 表里对应 cleanupThreshTime 之前的所有 batch 块数据 meta 信息

上面即是 ReceivedBlockTracker 的主体内容。

但我们还需要强调一点非常重要的内容,即 ReceivedBlockTracker 需要对 driver 进行容错保障。也就是,如果 driver 失效,新起来的 driver 必须能够通过 WAL 恢复出失效前的 ReceivedBlockTracker 状态,具体的就需要包括 streamIdToUnallocatedBlockQueues, timeToAllocatedBlocks, lastAllocatedBatchTime 等内容,也即需要前面讲的 4 个方法在修改 ReceivedBlockTracker 的状态信息的时候,要首先写入 WAL,才能在失效后从 WAL 恢复出相关信息。

有关 WAL 写入和故障恢复的内容,我们将在 模块 4:长时容错 里系统性的详解。

总结
本文主要详解了 driver 端的 Receiver 管理者 —— ReceiverTracker —— 的主要功能:

(1) ReceiverTracker 分发和监控 Receiver
ReceiverTracker 负责 Receiver 在各个 executor 上的分发
包括 Receiver 的失败重启

(2) ReceiverTracker 作为 RpcEndpoint
ReceiverTracker 作为 Receiver 的管理者,是各个 Receiver 上报信息的入口
也是 driver 下达管理命令到 Receiver 的出口

(3) ReceiverTracker 管理已上报的块数据 meta 信息
委托给自己的成员 ReceivedBlockManager 进行具体管理

完全参考自腾讯广告团队酷玩Spark的知识总结,本人觉得文章写的非常好,能收获许多知识,仅是为了方便阅读,将其复制到CSDN平台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BT中的Tracker 是指运行于服务器上的一个程序,这个程序能够追踪到底有多少人同时在下载同一个文件。 客户端连上tracker服务器,就会获得一个下载人员的名单,根据这个,BT会自动连上别人的机器进行下载。它是提供bt的服务器。把文件用bt发布出来的人需要知道该使用哪个服务器来为要发布的文件提供tracker。由于不指定服务器,BitTorrent采用BT文件来确定下载源。 BT中的Tracker 是指运行于服务器上的一个程序,这个程序能够追踪到底有多少人同时在下载同一个文件。 客户端连上tracker服务器,就会获得一个下载人员的名单,根据这个,BT会自动连上别人的机器进行下载。它是提供bt的服务器。把文件用bt发布出来的人需要知道该使用哪个服务器来为要发布的文件提供tracker。由于不指定服务器,BitTorrent采用BT文件来确定下载源。 tracker服务器是BT下载中必须的角色。一个BTclient在下载开始以及下载进行的过程中,要不停的与tracker服务器进行通信,以报告自己的信息,并获取其它下载client的信息。这种通信是通过HTTP协议进行的,又被称为tracker HTTP协议,它的过程是这样的: client向tracker发一个HTTP的GET请求,并把它自己的信息放在GET的参数中;这个请求的大致意思是:我是xxx(一个唯一的id),我想下载yyy文件,我的ip是aaa,我用的端口是bbb。。。 tracker对所有下载者的信息进行维护,当它收到一个请求后,首先把对方的信息记录下来(如果已经记录在案,那么就检查是否需要更新),然后将一部分(并非全部,根据设置的参数已经下载者的请求)参与下载同一个文件(一个tracker服务器可能同时维护多个文件的下载)的下载者的信息返回给对方。 Client在收到tracker的响应后,就能获取其它下载者的信息,那么它就可以根据这些信息,与其它下载者建立连接,从它们那里下载文件片断。 tracker服务器架设 BitTorrent Tracker是一个高性能增强型BitTorrent服务器。BitTorrent Tracker同时支持HTTP和UDP的Tracker协议,采用高性能服务器技术, 支持多端口同时监听,数据更新插件。BitTorrent Tracker通过了8万个文件和80万个在线用户的高强度测试。用户可根据需要自行改写数据库通信插件, 打造属于自己的服务器, 配合服务器端脚本可实现一个功能完备的BT服务器。   架设好后,您的tracker服务器地址格式为   外网ip:端口/announce
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值