Spark Streaming揭秘 Day33 checkpoint的使用
Spark Streaming揭秘 Day33
checkpoint的使用
今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint。
首先,我们会看下checkpoint的使用。另外,会看下在应用程序重新启动时,是如何处理checkpoint的。
Checkpoint保存什么
checkpoint作为容错的设计,基本思路是把当前运行的状态,保存在容错的存储系统中(一般是hdfs)。对于容错的处理,肯定是围绕作业紧密相关的,保存内容包括元数据和数据两部分。
从元数据角度讲,SparkStreaming中会有哪些内容需要保存呢,主要有三类:
- 程序的配置
- 应用程序的业务逻辑,保存在DStreamGraph里。
- 还有哪些没有处理的数据,即没有完成的batch。
从数据角度讲下,Checkpoint是对于状态(state)操作生效。
首先,一般情况下在接收数据并保存时,是使用WAL来容错,这个昨天讨论过,并不放在checkpoint里。
对状态(state)的DStream操作(updateStateByKey),操作会跨多个batch duration,后面数据对前面的有依赖,随着时间的推移,依赖链条会越来越长,这个时候需要使用checkpoint,把这个长链条持久化,成为短链条。
在官方例子RecoverableNetworkCount中,我们看到可以用如下方法创建一个可恢复的streamingContext。

那关键就是getOrCreate方法

里面提供了两种创建方式,第一次是创建新的streaming context,否则会从checkpoint数据中创建出上下文。第三个输入参数是Hadoop的配置,一般来说checkpoint存放在hdfs中。ignoreReadError,可以控制是否抛出异常。
让我们进入checkpoint的read方法。这里面是循环checkpoint目录中的文件,读取并反序列化,之后返回。

我们看下反序列化方法,生成一个Checkpoint类型。

Checkpoint里面包含了所有我们进行保存的内容。

使用checkpoint恢复
下面我们来看下使用checkpoint构建环境的过程。
首先,调用sparkContext.getOrCreate 来构建sparkContext。

之后是恢复DStreamGraph。

DStreamGraph的恢复过程中,关键是恢复所有的outputStream。

在恢复的过程中,默认是根据checkpoint文件重建RDD。

checkpoint的数据是保存在ReliableCheckpointRDD中,我们看下compute方法。可以看到,就是从checkpoint文件读取数据。

最后,还有恢复checkpointDuration。

Checkpoint的生成
生成是在JobGenerator中触发。
在每次生成Job后,都会触发checkpoint的写入事件。

doCheckpoint会写入一个Checkpoint对象,其核心就是采用序列化技术把对象写入磁盘。

今天对checkpoint的介绍就到这里,对于整个机制来看,还是有些漏洞,如果目录数据存在,但是代码变化了,有可能出现不能读取checkpoint里的内容,希望后续版本能改进。
欲知后事如何,且听下回分解!
DT大数据每天晚上20:00YY频道现场授课频道68917580
Spark Streaming揭秘 Day33 checkpoint的使用的更多相关文章
- Spark Streaming揭秘 Day32 WAL框架及实现
Spark Streaming揭秘 Day32 WAL框架及实现 今天会聚焦于SparkStreaming中非常重要的数据安全机制WAL(预写日志). 设计要点 从本质点说,WAL框架是一个存储系统, ...
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- Spark Streaming揭秘 Day26 JobGenerator源码图解
Spark Streaming揭秘 Day26 JobGenerator源码图解 今天主要解析一下JobGenerator,它相当于一个转换器,和机器学习的pipeline比较类似,因为最终运行在Sp ...
- Spark Streaming揭秘 Day13 数据安全容错(Driver篇)
Spark Streaming揭秘 Day13 数据安全容错(Driver篇) 书接上回,首先我们要考虑的是在Driver层面,有哪些东西需要维持状态,只有在需要维持状态的情况下才需要容错,总的来说, ...
- Spark Streaming揭秘 Day12 数据安全容错(Executor篇)
Spark Streaming揭秘 Day12 数据安全容错(Executor篇) 今天,让我们研究下SparkStreaming在Executor端的数据安全及容错机制. 在SparkStreami ...
- Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考
Spark Streaming揭秘 Day6 关于SparkStreaming Job的一些思考 Job是SparkStreaming的重要基础,今天让我们深入,进行一些思考. Job是什么? 首先, ...
- Spark Streaming揭秘 Day4-事务一致性(Exactly one)
Spark Streaming揭秘 Day4 事务一致性Exactly one 引子 对于业务处理系统,事务的一致性非常的关键,事务一致性(Exactly one),简单来说,就是输入数据一定会被处理 ...
- Spark Streaming揭秘 Day3-运行基石(JobScheduler)大揭秘
Spark Streaming揭秘 Day3 运行基石(JobScheduler)大揭秘 引子 作为一个非常强大框架,Spark Streaming兼具了流处理和批处理的特点.还记得第一天的谜团么,众 ...
- Spark Streaming揭秘 Day35 Spark core思考
Spark Streaming揭秘 Day35 Spark core思考 Spark上的子框架,都是后来加上去的.都是在Spark core上完成的,所有框架一切的实现最终还是由Spark core来 ...
随机推荐
- 10891 - Game of Sum
Problem EGame of SumInput File: e.in Output: Standard Output This is a two player game. Initially th ...
- C语言宏定义相关
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等.下面列举一些成熟软件中常用得宏定义......1,防止一个头文件被重复包含#ifndef COMDEF_H# ...
- Android(java)学习笔记107-0:通过反射获得构造方法并且使用
1.获取字节码文件对象: Class c = Class.forName("cn.itcast_01.Person"); 2.获取构造方法 ...
- oracle存储过程分页
1.首先在oracle中建包体,用于游标返回当前数据记录集 CREATE OR REPLACE PACKAGE pkg_query AS TYPE cur_query IS REF CURSOR; E ...
- 手把手教你使用Size Class
在 iOS8 中,我们不用再像以前那样,一个页面新建多个 xib 文件来适配不同类型的屏幕,现在我们可以把各种尺寸屏幕的适配工作放在一个文件中完成,然后可以通过不同类别的 Size 来定制各种尺寸的界 ...
- Sublime Text 2 实用快捷键[Mac OS X]
lucasfais 总结了一些非常实用的 Sublime Text 2 快捷键,Lucifr 将它们翻译成了中文,以方便查阅. 注意:修饰键(如⌘)后跟多个按键的情况表示在按住修饰键的情况下依次按下相 ...
- iaas,paas,saas理解
IaaS.PaaS.SaaS多次看到这几个单词,今天仔细看看来, 这几个词和云计算相关:1,iaaS,Hardware-as-a-Service,信息,硬件服务,服务器,存储和网络硬件,网络存储,带 ...
- pgpool postgresql集群、中间件
pgpool-II是一个工作于PostgreSQL服务器端和PostgreSQL客户端之间的中间件,它提供了如下的功能: 1.连接池 pgpool-II中保存了到PostgreSQL服务器的连接,然后 ...
- 怎么在html页面和js里判断是否是IE浏览器
HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...
- hdu 4607 树的直径
思路:利用dfs遍历整棵树,找出最长子树与次长子树,两者的和最大就是直径. 若k值小于直径就输出k-1,否则输出(k-d-1)*2+d; #include<iostream> #inclu ...