Spark Streaming的恢复机制——Checkpoint

Spark Streaming checkpoint 实现状态的恢复实现 阅读详情

前言:
一个Streaming Application 往往需要7*24 不间断的跑,所以需要有自动恢复失败前的状态(机器冗机,系统挂掉,jvm crash等),为了让上述成为可能,Spark Streaming需要checkpoint 足够多信息至一个具有容错设计的存储系统(HDFS数据备份)才能让Application从失败中恢复过来

Spark Streaming 会 checkpoint 两种类型的数据

  • Metadata(元数据) checkpointing - 保存定义了Streaming 计算逻辑至类似HDFS的支持容错的存储系统,用来恢复driver,
    原数据保存:
    1.配置-用于创建该Streaming application 的所有配置
    2.DStream 操作 - DStream 一些列的操作
    3.未完成的batches - 那些提交了job 但尚未执行或者未完成的batches

  • Data checkpointing - 保存已生产的RDDs至可靠的存储,这在某些stateful 转换中是有需要的,在这种转换中,生成RDD需要依赖前面的batches,会导致依赖链随着时间而变成,为了避免这种没有尽头的边长,要定期将中间生成的RDDs保存到可靠存储来切断依赖链

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

什么时候需要启用 checkpoint?

什么时候该启用 checkpoint 呢?满足以下任一条件:

  • 使用了 stateful 转换 - 如果 application 中使用了updateStateByKey或reduceByKeyAndWindow等 stateful 操作,必须提供 checkpoint 目录来允许定时的 RDD checkpoint (shuffle操作)
  • 希望能从意外中恢复 driver

如果 streaming app 没有 stateful 操作,也允许 driver 挂掉后再次重启的进度丢失,就没有启用 checkpoint的必要了。

如何使用 checkpoint?

启用 checkpoint,需要设置一个支持容错 的、可靠的文件系统(如 HDFS、s3 等)目录来保存 checkpoint 数据。通过调用 streamingContext.checkpoint(checkpointDirectory) 来完成。另外,如果你想让你的 application 能从 driver 失败中恢复,你的 application 要满足:

  • 若 application 为首次重启,将创建一个新的 StreamContext 实例
  • 如果 application 是从失败中重启,将会从 checkpoint 目录导入 checkpoint 数据来重新创建 StreamingContext 实例

通过 StreamingContext.getOrCreate 可以达到目的:

// Function to create and setup a new StreamingContext
def functionToCreateContext(): StreamingContext = {
    val ssc = new StreamingContext(...)   // new context
    val lines = ssc.socketTextStream(...) // create DStreams
    ...
    ssc.checkpoint(checkpointDirectory)   // set checkpoint directory
    ssc
}

// Get StreamingContext from checkpoint data or create a new one
val context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext _)

// Do additional setup on context that needs to be done,
// irrespective of whether it is being started or restarted
context. ...

// Start the context
context.start()
context.awaitTermination()

项目

// 通过函数来创建或者从已有的checkpoint里面构建StreamingContext
def functionToCreateContext(): StreamingContext = {
  val ssc = new StreamingContext(...)   // new context
  val rdds = ssc.socketTextStream(...) // create DStreams
  ...
  ssc.checkpoint("/spark/kmd/checkpoint")   // 设置在HDFS上的checkpoint目录
  //设置通过间隔时间,定时持久checkpoint到hdfs上
  rdds.checkpoint(Seconds(batchDuration*5))

  rdds.foreachRDD(rdd=>{
  //可以针对rdd每次调用checkpoint
  //注意上面设置了,定时持久checkpoint下面这个地方可以不用写
  rdd.checkpoint()

  }
  )
  //返回ssc
  ssc
}

def main(args:Array){
// 创建context
val context = StreamingContext.getOrCreate(checkpointDirectory, functionToCreateContext _)
// 启动流计算
context.start()
context.awaitTermination()
}

如果 checkpointDirectory 存在,那么 context 将导入 checkpoint 数据。如果目录不存在,函数 functionToCreateContext 将被调用并创建新的 context

ps:
除调用 getOrCreate 外,还需要你的集群模式支持 driver 挂掉之后重启之。例如,在 yarn 模式下,driver 是运行在 ApplicationMaster 中,若 ApplicationMaster 挂掉,yarn 会自动在另一个节点上启动一个新的 ApplicationMaster。

需要注意的是,随着 streaming application 的持续运行,checkpoint 数据占用的存储空间会不断变大。因此,需要小心设置checkpoint 的时间间隔。设置得越小,checkpoint 次数会越多,占用空间会越大;如果设置越大,会导致恢复时丢失的数据和进度越多。一般推荐设置为 batch duration 的5~10倍。

导出 checkpoint 数据

上文提到,checkpoint 数据会定时导出到可靠的存储系统,那么
1.在什么时机进行 checkpoint
2.checkpoint 的形式是怎么样的

在什么时机进行 checkpoint
在 Spark Streaming 中,JobGenerator 用于生成每个 batch 对应的 jobs,它有一个定时器,定时器的周期即初始化 StreamingContext 时设置的 batchDuration。这个周期一到,JobGenerator 将调用generateJobs方法来生成并提交 jobs,这之后调用 doCheckpoint 方法来进行 checkpoint。doCheckpoint 方法中,会判断当前时间与 streaming application start 的时间之差是否是 checkpoint duration 的倍数,只有在是的情况下才进行 checkpoint。

checkpoint 的形式
最终 checkpoint 的形式是将类 Checkpoint的实例序列化后写入外部存储,值得一提的是,有专门的一条线程来做将序列化后的 checkpoint 写入外部存储。类 Checkpoint 包含以下数据这里写图片描述

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

Checkpoint 的局限

Spark Streaming 的 checkpoint 机制看起来很美好,却有一个硬伤。上文提到最终刷到外部存储的是类 Checkpoint 对象序列化后的数据。那么在 Spark Streaming application 重新编译后,再去反序列化 checkpoint 数据就会失败。这个时候就必须新建 StreamingContext。

坑一,会报错:

xxxx classs ClassNotFoundException

问题就出在checkpoint上,因为checkpoint的元数据会记录jar的序列化的二进制文件,因为你改动过代码,然后重新编译,新的序列化jar文件,在checkpoint的记录中并不存在,所以就导致了上述错误,如何解决:

解决方法:
删除checkpoint开头的的文件即可,不影响数据本身的checkpoint

hadoop fs -rm /spark/kmd/check_point/checkpoint*

坑二:
处理的逻辑必须写在functionToCreateContext函数中,你要是直接写在main方法中,在首次启动后,kill关闭,再启动就会报错

关闭命令

yarn application -kill application_1482996264071_34284

再次启动后报错信息:

has not been initialized when recovery from checkpoint

解决方案:将逻辑写在函数中,不要写main方法中,

针对这种情况,在我们结合 Spark Streaming + kafka 的应用中,我们自行维护了消费的 offsets,这样一来及时重新编译 application,还是可以从需要的 offsets 来消费数据,这里只是举个例子,不详细展开了。

大数据Spark(三十八):SparkStreaming实战案例三 状态恢复 扩展 实现SparkStreaming程序停止之后再启动时还能够接着上次的结果进行累加。先发送spark,得到spark,1。再发送spark,得到spark,2。再发送spark,得到spark,3。再停止程序,然后重新启动。 阅读详情

相关推荐

大数据Spark(三十七):SparkStreaming实战案例二 UpdateStateByKey

对从Socket接收的数据做WordCount并要求能够和历史数据进行累加!如:先发了一个spark,得到spark,1然后不管隔多久再发一个spark,得到spark,2也就是说要对数据的历史状态进行维护!注意:可以使用如下API对状态进行维护。

Lansonli(蓝深李)的博客 1298

从spark streaming checkpoint文件中还原数据

checkpoint的最大的弊端在于,一旦你的流式程序代码或配置改变了,或者更新迭代新功能了,这个时候,你先停旧的sparkstreaming程序,然后新的程序打包编译后执行运行,会发现两种情况: (1)启动报错,反序列化异常 (2)启动正常,但是运行的代码仍然是上一次的程序的代码。 如果直接把上次的checkpoint删除了,可以启动的新的程序,但是如果使用的是有状态计算(updateSt

walt_xu的专栏 2624

Spark-Streaming KafkaDirectDStream checkpoint的原理

JobGenrerator.generateJobs负责Streaming Job的产生,产生并且提交执行Job之后,会发送DoCheckpoint事件,源码如下: [java] view plain copy private def generateJobs(time: Time) {       // Set the SparkEnv in t

mtj66的博客,交流WX:SpringBreeze1104 2188

spark从入门到放弃四十九:Spark Streaming(9)updateStateByKey

spark从入门到放弃四十九:Spark Streaming(9)updateStateByKey

u012957549的博客 3242

大数据领域Spark的流处理容错设计

实时流处理是大数据领域的核心场景之一,广泛应用于实时监控、风控预警、用户行为分析等业务。然而,分布式系统的故障(如节点宕机、网络中断、进程崩溃)是不可避免的。故障发生后如何快速恢复计算状态?如何保证数据“至少一次”(At-Least Once)或“精确一次”(Exactly Once)的处理语义?如何平衡容错开销与系统性能?本文聚焦Spark流处理框架(包括Spark Streaming与Structured Streaming)的容错设计,覆盖原理分析、数学建模、代码实战与生产调优。

AI天才研究院 948

Unity2018连接MySQL数据库

当前在做的一个Unity项目需要连接到MySQL数据库,弄了一整天,排了很多错,终于在Unity上成功连接到MySQL数据库了,所以分享一下,避免有这个需求的朋友不用花那么多时间。 我使用的软件是 Unity20184.0f1 + mysql-8.0.24 导入 MySql.Data.dll 首先需要把 MySql.Data.dll 导入到Assets/Plugins 这个dll需要安装Connector/NET,在安装目录\Assemblies\v4.0中拿到,最好不要下载版本太高的,版本太高导入的时候

ZLX的博客 9449

Spark Streaming-Checkpoint机制

转载地址:https://blog.youkuaiyun.com/anbang713/article/details/82047980 一 概述 每一个Spark Streaming应用,正常来说都是要7 * 24小时运转的,这就是实时计算程序的特点。因为要持续不断的对数据进行计算。因此对实时计算应用的要求,应该是必须要能够对与应用程序逻辑无关的失败,进行容错。 如果要实现这个目标,Spark Stre...

learn_tech的博客 578

电源完整性之Cadence Sigrity Power SI_AC阻抗仿真

之前和大家分享过电源完整性之仿真设计原理链接: [link](https://blog.youkuaiyun.com/weixin_41808082/article/details/117065140?spm=1001.2014.3001.5501).今天接着上一篇文章总结一下电源AC阻抗的的仿真操作流程及一些simulation中的设置参数,用到的时候Cadence Sigrity 中的Power SI组件,下面开始享受仿真的快乐吧: 1.仿真模式选择与文件导入 选择Cadence Sigrity下的Power SI

刘小同学的博客 1万+

structured streaming的checkpoint文件无限增长

目录structured streaming的checkpoint文件无限增长 structured streaming的checkpoint文件无限增长 原理和处理办法: https://www.waitingforcode.com/apache-spark-structured-streaming/checkpoint-storage-structured-streaming/read#will_it_grow_indifinetely Will it grow indefinitely? No. Ap

tianjun2012的专栏 954

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 704

保姆级教程:在RK3588开发板上用MPP库实现H.264硬编码(附完整代码)

本文详细介绍了在RK3588开发板上使用MPP库实现H.264硬编码的全流程,包括环境准备、MPP库编译、编码器初始化与配置、数据输入与编码流程以及高级性能优化技巧。通过实战案例和完整代码,帮助开发者充分利用RK3588的VPU硬件加速能力,提升视频编码效率和质量。

weixin_28716769的博客 414

Spark Streaming 实战案例(四) Spark Streaming 缓存、Checkpoint机制

主要内容 Spark Stream 缓存Checkpoint案例 1. Spark Stream 缓存 通过前面一系列的课程介绍,我们知道DStream是由一系列的RDD构成的,它同一般的RDD一样,也可以将流式数据持久化到内容当中,采用的同样是persisit方法,调用该方法后DStream将持久化所有的RDD数据。这对于一些需要重复计算多次或数据需要反复被使用的DStream特别有效

春华秋实 1202

全面分析总结解决Could not transfer artifact org.apache.maven.plugins等此类问题的方法

全面分析总结解决Could not transfer artifact org.apache.maven.plugins,Could not transfer artifact xxx from/to xxx等此类问题的方法

ccjjjjdff的博客 1万+

spark streaming的checkpoint使用代码

当executor宕机了,可以从checkpoint目录恢复元数据、以及该rdd已经计算好的结果等等 而spark streaming当整个driver程序关了之后,再次重新运行该driver程序,由于还是使用同一个checkpoint目录,所以此时该driver会从该checkpoint目录恢复数据。。。可以运行两次试试,第二次运行时打印的时间戳是紧跟着上一次运行结束时的时间戳。 ...

祁东握力的博客 369

Python自动化车载测试:5分钟搞定CANoe COM接口调用(附完整代码)

本文详细介绍了如何使用Python快速实现CANoe COM接口调用,完成车载测试自动化。通过实战案例展示ECU信号测试框架搭建,包括环境配置、核心架构解析、信号读写封装及多线程安全方案,帮助开发者5分钟内掌握高效测试技巧。

vv45678的博客 1133

微信小程序 - 完美解决“code“:“NO_AUTH“,“message“:“商户号该产品权限未开通,请前往商户平台>产品中心检查后重试“(微信小程序报错问题排查解决)

微信小程序NO_AUTH: 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试?微信小程序提示商户号该产品权限未开通,请前往商户平台>产品中心检查后重试,微信小程序"code":"NO_AUTH"错误码怎么解决,报错信息如下:httpResponseBody[{"code":"NO_AUTH","message":"商户号该产品权限未开通,请前往商户平台>产品中心检查后重试"}],微信小程序支付问题,如何解决这个问题,虚拟支付商户号,虚拟支付商户号里面没有产品支付的页面,排查商户号没问题,商户号配置

🏆 前端领域优质创作者 4444

spark从入门到放弃五十四:Spark Streaming(14)checkpoint

1.概述每一个spark streaming 应用正常来说都要7*24小时运转的,这就是实时计算程序的特点。因为要持续不断的对数据进行计算。因此,对实时计算的要求,应该是必须能够与应用程序逻辑无关的失败,进行容错。 如果要实现这个目标,spark streaming 程序就必须将足够的信息checkpoint 到容错的存储系统上,从而让他能够从失败中进行恢复。有两种数据需要进行chec

u012957549的博客 2857

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 639

SparkStreaming之checkpoint机制使用讲解

一 什么类型的数据需要使用checkpoint? Spark Streaming是最需要进行容错的,因为一般都是7 * 24小时运转,所以需要将足够的信息checkpoint到容错的存储系统上,比如HDFS,从而能够让他从失败中进行恢复。有两种数据需要被进行checkpoint: 1、元数据checkpoint: # 配置信息:创建spark streaming应用程序的配置信息,比如Spa...

遥望...... 2125

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Checkpoint机制

每一个Spark Streaming应用,正常来说,都是要7 * 24小时运转的,这就是实时计算程序的特点。因为要持续不断的对数据进行计算。因此,对实时计算应用的要求,应该是必须要能够对与应用程序逻辑无关的失败,进行容错。 如果要实现这个目标,Spark Streaming程序就必须将足够的信息checkpoint到容错的存储系统上,从而让它能够从失败中进行恢复。有两种数据需要被进行che...

ailiandeziwei的专栏 361

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

96、Spark Streaming之Checkpoint机制

Checkpoint机制概述 每一个Spark Streaming应用,正常来说,都是要7 * 24小时运转的,这就是实时计算程序的特点。因为要持续不断的对数据进行计算。因此,对实时计算应用的要求,应该是必须要能够对与应用程序逻辑无关的失败,进行容错。 如果要实现这个目标,Spark Streaming程序就必须将足够的信息checkpoint到容错的存储系统上,从而让它能够从失败中进行恢复。有...

ZJ__ZFH的博客 1633

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

spark checkpoint详解

转载地址:https://www.cnblogs.com/superhedantou/p/9004820.html checkpoint在spark中主要有两块应用:一块是在spark core中对RDD做checkpoint,可以切断做checkpoint RDD的依赖关系,将RDD数据保存到可靠存储(如HDFS)以便数据恢复;另外一块是应用在spark streaming中,使用checkp...

learn_tech的博客 2067

【Spark】SparkStreaming-如何使用checkpoint

SparkStreaming-如何使用checkpoint  sparkstreaming checkpoint 默认_百度搜索spark streaming中使用checkpoint - HarkLee - 博客园Spark Streaming checkpoint 实现状态的恢复实现 - 优快云博客Spark Streaming如何使用checkpoint容错 - 优快云博客...

weixin_34026276的博客 108

Spark Streaming checkpoint概述

Spark Streaming揭秘 checkpoint的使用 https://www.cnblogs.com/jcchoiling/p/6513569.html 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint。 首先,我们会看下checkpoint的使用。另外,会看下在应用程序重新启动时,是如何处理checkpoint的。 Checkpoint保存什...

fengfengchen95的博客 238

Spark streaming 的checkpoint

由于 Spark streaming原则上来说是要一直运行的, 所以需要的一个机制从streaming过程中如果出错了时候能够正常恢复,这时候就需要checkpoint。 由于系统要从checkpoint的点恢复, 所以必须要保证 保存checkpoint的文件系统是可靠的。 于是本地文件系统 ntfs/ext4 这样不适合作为保存 checkpoint的系统。 而HDFS,这样的分布式...

a8131357leo的博客 250

Spark Streaming之checkpoint机制

目录一、checkpoint机制二、checkpoint启用方式三、Driver失败重写超过程序四、配置spark-submit提交参数五、checkPoint的说明 一、checkpoint机制 每一个Spark Streaming应用,正常来说,都是要7 * 24小时运转的,这就是实时计算程序的特点。因为要持续 不断的对数据进行计算。因此,对实时计算应用的要求,应该是必须要能够对与应用程序逻辑无关的失败,进行 容错。 如果要实现这个目标,Spark Streaming程序就必须将足够的信息checkpo

蔡政洁的博客 2018
上一篇: Spark SQL案例介绍与编程实现
下一篇: 安全停止sparkStreaming任务
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值