Spark Streaming揭秘 Day13 数据安全容错(Driver篇)
Spark Streaming揭秘 Day13
数据安全容错(Driver篇)
书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说,一共有三个组件需要容错:
- 数据层面:ReceiverBlockTracker,专门负责管理整个SparkStreaming运行数据的元数据,主要用来跟踪数据,需要状态。
- 逻辑层面:DStream和DStreamGraph,表达依赖关系,在恢复的时候需要恢复计算逻辑级别的依赖关系。
- 作业生成层面:JobGenerator,表明正在怎么基于RBT和DStreams的关系生成作业,消费了哪些数据,进行到了哪些程度,都需要容错。
在Driver层面,主要也是采用checkpoint和WAL两个容错机制。
ReceiverBlockTracker容错
ReceiverBlockTracker,会管理SparkStreaming运行过程中的所有数据,指针指向具体数据。所有操作都会保存在WAL中,所以当失败后可以恢复。
在ReceiverBlockTracker中,核心是如下的两个数据结构:
- 未分配队列streamIdToUnallocatedBlockQueues:存储所有已接收但是还没有分配给具体Batch的Block,会被具体Receiver调用。
- 已分配队列timeToAllocatedBlocks:表示已分配的Block,会被JobGenerator调用。需要注意的是,这是个HashMap,所以可以存很多Batch Duration的Blocks,可以支持window或者state操作。
所以,我们可以围绕数据的三个阶段展开:
阶段一:addBlock方法主要负责收集数据写入未分配队列
我们可以看到,当收到Executor端传过来的数据,第一步通过writeToLog方法进行元数据的容错处理。需要注意,在这里并没有判断啥调用条件,具体的容错方式是在writeToLog方法内部判断的。
阶段二:allocateBlocksToBatch方法主要负责将未分配队列数据写入已分配队列
在获取所有未分配数据的时候,采用dequeue方法,其中隐含的会进行一个union操作,按照streamID(表示不同的输入数据来源)进行汇总。
同时,在获取数据后,首先做writeToLog,在成功写入WAL之后,才会把元数据放入已分配队列中。
阶段三:CleanUpOldBatchs将过期数据进行销毁
我们可以看到,在实际执行销毁前,也会调用writeToLog进行灾备。
综上所述,在数据管理层面,数据生成、消费、销毁的时候都做灾备!!!
writeToLog
这是进行容错的核心方法,方法本身也是比较简洁的。
首先,会通过isWriteAheadLogEnabled方法进行备份方式在判断,我们发现,其最终是调用了如下的方法。可以看到其核心就是使用到了checkpoint目录,也就是说备份其实是基于checkpoint机制进行的。
实际备份其实就是以WAL的方法进行文件写入,writeToLog目前程序出错时可以recover,但是程序升级时不行,可以通过覆写代码,将WAL保存在其他的地方。
总结来说,checkpoint提供了数据的存放位置,而WAL则是具体的数据组织方法。
欲知后事如何,且听下回分解
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Streaming揭秘 Day13 数据安全容错(Driver篇)的更多相关文章
- Spark Streaming揭秘 Day12 数据安全容错(Executor篇)
Spark Streaming揭秘 Day12 数据安全容错(Executor篇) 今天,让我们研究下SparkStreaming在Executor端的数据安全及容错机制. 在SparkStreami ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...
- Spark Streaming揭秘 Day4-事务一致性(Exactly one)
Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...
- Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘
Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...
- Spark Streaming揭秘 Day33 checkpoint的使用
Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...
- Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming 在Spark2.x中,Spark Streaming获得了比较全面的升级,称为St ...
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- Spark Streaming揭秘 Day24 Transformation和action图解
Spark Streaming揭秘 Day24 Transformation和action图解 今天我们进入SparkStreaming的数据处理,谈一下两个重要的操作Transfromation和a ...
随机推荐
- 使用coreData
1.设计数据模型 2.创建持久化视图和控制器 #import "BIDViewController.h" #import "BIDAppDelegate.h" ...
- Asp.Net 之 网页快照
此文做法不是 Control.DrawToBitmap ,而是直接QueryInterface 浏览器Com对象的 IViewObject 接口,用它实现的Draw方法,画到图像上. 首先,定义IVi ...
- 关于 error: LNK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案【Qt】【 VS2010】
近日因为换装硬盘重装了系统,于是不得不重新安装VS2010 Qt 这些个开发工具.安装过程都没什么问题,安装完了顺手点了个例子测试下好没好用,于是就出现了标题中的错误提示.之前处理过一次,时间久了就忘 ...
- 使用JS制作一个鼠标可拖的DIV(二)——限制区域移动
这次是要对上一篇的内容进行扩展. 由于需要对可拖动的 DIV 进行一个区域范围的限制,所以要给于一个容器,让可拖动的 DIV 元素不能逃出该容器的大小范围. 一.思路 1.在外层增加一个 DIV 容器 ...
- learning nodejs 2 - connect middleware
学习了connect module nodejs 的中间件方式 var connect = require('connect'); var server = connect.createServer( ...
- sql 联合查询速度慢,需要对其进行分组
分组:SELECT * FROM(SELECT ROW_NUMBER() OVER(ORDER BY ProjID) as row_number,* FROM ( select ProjAppl ...
- saltstack实战4--综合练习4
Saltstack配置管理-给minion增加Zabbix-agent zabbix-agent的包 [root@A ~]# rpm -qa |grep zabbix zabbix-2.4.8-1.e ...
- (转)linuxmint,ubuntu 下修改guake宽度方法
之前在网上找到修改guake.py的方式,但是我一直没能找到guake.py的文件,弄的我纠结,后来找到这个文章,这个确实是有效果的 Ubuntu12.04上Guake在唤出的时候滚动条会消失,主要原 ...
- php 常用的好函数(持续更新)
parse_url parse_url $url = "http://www.electrictoolbox.com/php-extract-domain-from-full-url/&qu ...
- django 学习-5 模板使用流程
首先在模板下建一个index.html <!DOCTYPE html><html><head><meta charset="utf-8" ...