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中,需要注意如果这个时候数据丢失了,就真的丢失了。![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_43.png)
BlockGenerator中最为关键的是两个线程:
![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_39.png)
线程1. blockIntervalTimer把数据合并为block
线程2. blockPushingThread把合并后的block通过BlockManager来存储
Step2:Block生成
blockIntervalTimer以一个固定间隔生成block(默认200ms)从currentBuffer生成Block,放入blocksForPushing。![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_41.png)
Step3:Block存储
blockPushingThread每10ms从blocksForPushing中获取数据,并调用pushBlock进行后续处理。![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_45.png)
对pushBlock的调用,我们可以跟踪到如下关键代码:
可以看到主要有两项工作,一是进行数据存储,二是向Driver进行汇报!!!
![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_47.png)
让我们进入存储部分的代码,发现其最终是调用的Spark的BlockManager来进行实际数据的存储。
![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_49.png)
其他
从ReceiverSupervisor定义的事件中,我们可以发现还有两个比较重要的方法。![](http://o6jujlzry.bkt.clouddn.com/2016-05-16-Snip20160516_50.png)
cleanupOldBlocks,在每个batch处理完,会根据Driver发送的信息将旧的block清理掉,这也是程序能7*24小时持续运行的保证!!!
updateRateLimit,可以动态调整消息接收的速度,实际上,是通过限定存储的速度,来限定流动的速度。
最后,最重要的:
从架构角度,我们可以把数据接收模块理解为一个mvc架构。
model是Receiver,在底层负责数据的获取。
controller是ReceiverSupervisor,主要负责对Receiver的控制,receiver收到数据后,交给ReceiverSupervisor存储数据。
view是Driver,其利用元数据对外提供服务,并在需要时通过ReceiverSupervisor调用Receiver获取数据。
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580相关文章推荐
- python中模拟进行ssh命令的执行
- LeetCode Single Number II
- spring数据连接泄漏
- python中模拟进行ssh命令的执行
- ssh加密访问
- Java面向对象之继承
- Java面向对象之多态
- 深入java之java语言基础(一)
- 【BZOJ4597】【Shoi2016】随机序列 线段树
- VC隐藏console
- HYSBZ 1758 重建计划
- Java面向对象之多态
- python
- Linux软RAID的技术概要及实现
- error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1800”不匹配值“1600”
- Eclipse 运行C/C++
- 博客开始篇
- Java中的反射机制复习
- 类模板和模板函数连接出错处理
- 4-2 跳马