您的位置:首页 > 其它

Spark Streaming揭秘 Day10 从BlockGenerator看接收数据的生命周期

2016-05-16 21:42 232 查看

Spark Streaming揭秘 Day10

从BlockGenerator看接收数据的生命周期

昨天主要介绍了SparkStreaming中对于Receiver的生命周期管理,下面让我们进入到Receiver内部,研究下其工作机制。

首先,先总结下SparkStreaming中接收数据的特点:

数据需要不间断的按照次序接收

由于在driver中需要保存元数据,在存储数据之后,需要不断汇报给driver

让我们进入接收数据关键的BlockGenerator进行分析。

Block概念

Block是Spark中非常重要的概念,在receiver接收数据过程中也非常的重要。简单来说,Receiver(以Kafka为例)是一条一条接收数据的,但是出于效率考虑,需要合并为block供后续处理。其操作主要分为三步。

Step1:数据接收

会统一将数据放入currentBuffer中,需要注意如果这个时候数据丢失了,就真的丢失了。



BlockGenerator中最为关键的是两个线程:



线程1. blockIntervalTimer把数据合并为block

线程2. blockPushingThread把合并后的block通过BlockManager来存储

Step2:Block生成

blockIntervalTimer以一个固定间隔生成block(默认200ms)从currentBuffer生成Block,放入blocksForPushing。



Step3:Block存储

blockPushingThread每10ms从blocksForPushing中获取数据,并调用pushBlock进行后续处理。



对pushBlock的调用,我们可以跟踪到如下关键代码:

可以看到主要有两项工作,一是进行数据存储,二是向Driver进行汇报!!!



让我们进入存储部分的代码,发现其最终是调用的Spark的BlockManager来进行实际数据的存储。



其他

从ReceiverSupervisor定义的事件中,我们可以发现还有两个比较重要的方法。



cleanupOldBlocks,在每个batch处理完,会根据Driver发送的信息将旧的block清理掉,这也是程序能7*24小时持续运行的保证!!!

updateRateLimit,可以动态调整消息接收的速度,实际上,是通过限定存储的速度,来限定流动的速度。

最后,最重要的:

从架构角度,我们可以把数据接收模块理解为一个mvc架构。

model是Receiver,在底层负责数据的获取。

controller是ReceiverSupervisor,主要负责对Receiver的控制,receiver收到数据后,交给ReceiverSupervisor存储数据。

view是Driver,其利用元数据对外提供服务,并在需要时通过ReceiverSupervisor调用Receiver获取数据。

欲知后事如何,且听下回分解

DT大数据每天晚上20:00YY频道现场授课频道68917580
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: