Spark Streaming容错

检查点机制-checkpoint

  

  什么是检查点机制?

    Spark Streaming 周期性地把应用数据存储到诸如HDFS 或Amazon S3 这样的可靠存储系统中以供恢复时使用的机制叫做检查点机制

  检查点机制的作用

    控制发生失败时需要重算的状态数

    Spark Streaming通过lineage重算,检查点机制则可以控制需要在lineage中回溯多远

    提供驱动器程序容错

    如果流计算应用中的驱动器程序崩溃了,你可以重启驱动器程序,并让驱动器程序从检查点恢复,这样SparkStreaming就可以读取之前运行的程序处理数据的进度,并从那里继续。

  checkpoint 两种类型的数据:

  Metadata(元数据) checkpointing - 保存定义了 Streaming 计算逻辑至类似 HDFS 的支持容错的存储系统。用来恢复 driver,元数据包括:

    1.配置 - 用于创建该 streaming application 的所有配置

    2.DStream 操作 - DStream 一些列的操作

    3.未完成的 batches - 那些提交了 job 但尚未执行或未完成的 batches。

  RDD Data checkpointing - 保存已生成的RDDs至可靠的存储。

  metadata checkpointing 主要用来恢复 driver;而 RDD数据的 checkpointing 对于stateful 转换操作是必要的。

  对于window和stateful操作必须checkpoint(Spark Streaming会检查并给出提示)。

  通过StreamingContext的checkpoint来指定目录,默认按照batch Duration来做checkpoint。

  通过DStream的checkpoint指定当前DStream的间隔时间。

  间隔必须是slide interval的倍数。

检查点机制-checkpoint的形式

  checkpoint 的形式是将类 Checkpoint的实例序列化后写入外部存储,值得一提的是,有专门的一个线程来做将序列化后的 checkpoint 写入外部存储的操作。类 Checkpoint 包含以下数据:

  除了 Checkpoint 类,还有 CheckpointWriter 类用来导出 checkpoint,CheckpointReader 用来导入 checkpoint。

检查点机制-checkpoint的局限

  Spark Streaming 的 checkpoint 机制看起来很美好,却有一个硬伤。

  前面提到最终刷到外部存储的是类 Checkpoint 对象序列化后的数据。那么在 Spark Streaming application 重新编译后,再去反序列化 checkpoint 数据就会失败。这个时候就必须新建 StreamingContext。

  针对这种情况,在我们结合 Spark Streaming + kafka 的应用中,需要自行维护了消费的 offsets,这样一来即使重新编译 application,还是可以从需要的 offsets 来消费数据。对于其他的情况需要大家根据实际需求自行处理。

Driver节点容错

  如果你想让你的application能从driver失败中恢复,你的application要满足:

  若application为首次重启,将创建一个新的 StreamContext 实例

  如果application是从失败中重启,将会从 checkpoint 目录导入 checkpoint 数据来重新创建 StreamingContext 实例

def createStreamingContext() = {
...
val sparkConf = new SparkConf().setAppName(“xxx")
val ssc = new StreamingContext(sparkConf , Seconds())
ssc.checkpoint(checkpointDir)
ssc
}
...
val ssc = StreamingContext.getOrCreate(checkpointDir, createStreamingContext _)

  除调用 getOrCreate 外, 你还需要编写在驱动器程序崩溃时重启驱动器进程的代码。

  在 yarn 模式下,driver 是运行在 ApplicationMaster 中,若 ApplicationMaster 挂掉,yarn 会自动在另一个节点上启动一个新的 ApplicationMaster。

  Spark standalone模式下:

  ./bin/spark-submit --deploy-mode cluster --supervise --master spark://... App.jar

Worker节点容错

  为了应对工作节点失败的问题,Spark Streaming 使用与Spark 的容错机制相同的方法,根据不同的输入源,分两种情况:

  使用可靠输入源—如HDFS

  由于输入数据是可靠的,所有数据都可以重新计算,因此不会丢失数据

  使用基于网络接收的输入源—例如Kafka、Flume等

  接收到的数据会在集群的不同节点间复制(默认复本数为2)

  一个工作节点失效,在恢复时可以从另一个工作节点的数据中重新计算

  如果是接收数据的工作节点失效,那就可能丢失数据(数据已经收到但是还未复制到其他节点,也没有处理完是失效了)

  处理保证

  所有转换操作为精确一次保证(Spark Streaming 工作节点的容错保障)

  输出操作在把结果保存到外部存储时,写结果的任务可能因故障而执行多次,一些数据可能也就被写了多次

  可以使用事务操作来写入外部系统(即原子化地将一个RDD分区一次写入),或者设计幂等的更新操作(即多次运行同一个更新操作仍生成相同的结果)。比如Spark Streaming 的saveAs...File 操作会在一个文件写完时自动将其原子化地移动到最终位置上,以此确保每个输出文件只存在一份。

Spark Streaming概念学习系列之Spark Streaming容错的更多相关文章

  1. Spark RDD概念学习系列之RDD的容错机制(十七)

    RDD的容错机制 RDD实现了基于Lineage的容错机制.RDD的转换关系,构成了compute chain,可以把这个compute chain认为是RDD之间演化的Lineage.在部分计算结果 ...

  2. Spark RDD概念学习系列之Spark Hash Shuffle内幕彻底解密(二十)

    本博文的主要内容: 1.Hash Shuffle彻底解密 2.Shuffle Pluggable解密 3.Sorted Shuffle解密 4.Shuffle性能优化 一:到底什么是Shuffle? ...

  3. Spark SQL概念学习系列之Spark SQL 架构分析(四)

    Spark SQL 与传统 DBMS 的查询优化器 + 执行器的架构较为类似,只不过其执行器是在分布式环境中实现,并采用的 Spark 作为执行引擎. Spark SQL 的查询优化是Catalyst ...

  4. Spark SQL概念学习系列之Spark SQL概述

    很多人一个误区,Spark SQL重点不是在SQL啊,而是在结构化数据处理! Spark SQL结构化数据处理 概要: 01 Spark SQL概述 02 Spark SQL基本原理 03 Spark ...

  5. Spark Streaming概念学习系列之Spark Streaming的竞争对手

    不多说,直接上干货! Spark Streaming的竞争对手 Storm 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology).这个拓扑将会被提交给集群,由集群中的 ...

  6. Spark RDD概念学习系列之Spark的数据存储(十二)

    Spark数据存储的核心是弹性分布式数据集(RDD). RDD可以被抽象地理解为一个大的数组(Array),但是这个数组是分布在集群上的. 逻辑上RDD的每个分区叫一个Partition. 在Spar ...

  7. Spark SQL概念学习系列之Spark SQL的简介(一)

    Spark SQL提供在大数据上的SQL查询功能,类似于Shark在整个生态系统的角色,它们可以统称为SQL on Spark. 之前,Shark的查询编译和优化器依赖于Hive,使得Shark不得不 ...

  8. Spark RDD概念学习系列之Spark的算子的分类(十一)

    Spark的算子的分类 从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理. Transformat ...

  9. Spark SQL概念学习系列之Spark SQL 优化策略(五)

    查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟.除了查询优化, Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略. (1)内存列式存 ...

随机推荐

  1. 【ng-zorro-antd】加入in-memory-web-api插件后icon不显示

    在ng-zorro-antd框架下,根据angular的技术文档demo,加入in-memory-web-api后icon不显示 解决方案: 在app.module.ts中的imports:[]加入 ...

  2. 团体程序设计天梯赛-练习集-L1-041. 寻找250

    L1-041. 寻找250 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字. 输入格式: 输入在一行中给出不知道多少个绝对值不超过1000的整数,其中 ...

  3. loadrunner报错总结

    1.报错   没有缓存空间可用   TCP超时释放时间?是解决刚才那个报错的? 解决方法如下  修改TcpTimedWaitDelay值为1和MaxUserPort值为65534.最后,重启!  完美 ...

  4. 3.在eclipse中创建Web项目,并部署到Tomcat上

    1.找到创建web项目的菜单 2.创建web项目并选择web环境 3.查看创建好的web项目结构 4.在web项目的webContent文件夹下创建jsp页面 5.查看是否创建jsp页面成功,并编辑j ...

  5. AnimationEvent事件问题

    AnimationEvent事件问题 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/deta ...

  6. PHP学习总结(14)——PHP入门篇之常用运算符

    一.什么是运算符 什么是运算符?运算符是告诉PHP做相关运算的标识符号.例如,你需要计算123乘以456等于多少,这时候就需要一个符号,告诉服务器,你需要做乘法运算. PHP中的运算符有哪些?PHP运 ...

  7. maven知识总结

    使用maven中的命令运行web项目 以上为web项目的目录结构  必须是maven项目 启动命令行  使用 mvn tomcat:run   敲击回车 访问红框中的地址: 关闭命令行   那么项目就 ...

  8. Selenium Webdriver——操作隐藏的元素display属性

    有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...

  9. LID&LDS 的另外一种算法

    参见:LIS,LDS的另类算法(原) 然后讲讲我的想法:  有结论不上升子序列的个数=最长上升子序列的长度.....至于为什么,在下面讲 上代码: #include <iostream> ...

  10. (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】

    上面我们介绍了Spring Boot 的默认资源映射,一般够用了,那我们如何自定义目录? 这些资源都是打包在jar包中的,然后实际应用中,我们还有很多资源是在管理系统中动态维护的,并不可能在程序包中, ...