完整教程:Flink 容错从状态后端到 Exactly-Once

news/2025/9/27 18:56:10/文章来源:https://www.cnblogs.com/yxysuanfa/p/19115483

1. 为什么需要状态快照?

流式应用一旦有状态(聚合、去重、规则命中、窗口累加等),故障恢复就不仅是“重跑消息”这么简单;你还要把状态恢复到与输入位置一致的点。Flink 通过**快照(Snapshot)**把“各有状态算子当前的状态 + 各 Source 读到的位置”一起固化下来:

  • 故障时,从最近一次快照回放未处理的数据,状态也回滚到那一刻;
  • 对外表现为:作业好像从未出过错。

2. 状态后端怎么选?(RocksDB vs Heap)

Flink 的状态存放在 State Backend 里,常用两种:

后端工作状态位置快照能力适用场景与取舍
EmbeddedRocksDBStateBackend本地磁盘(临时目录)全量+增量,异步状态可大于内存,恢复稳定;但读写需序列化/反序列化,大约比堆后端慢一个数量级。大状态/长保留/高可用优先选它。
HashMapStateBackendJVM 堆全量,异步低延迟、简单直接;但受 GC 影响,需要很大堆。状态中小、延迟敏感、可控内存时考虑。

实战建议

3. Checkpoint 存储怎么放?(FileSystem vs JobManager)

Checkpoint 是把所有算子的状态周期性保存到一个持久位置。存哪儿由 Checkpoint Storage 决定:

存储位置特点
FileSystemCheckpointStorage分布式文件系统(HDFS、对象存储等)大规模状态高耐久性生产强烈推荐
JobManagerCheckpointStorageJobManager 堆内仅适合本地/小状态实验与调试

生产必须用分布式文件系统,否则故障时恢复与扩容都没保障。

4. Snapshot、Checkpoint、Savepoint 有何不同?

简单记:恢复优先用 checkpoint;变更/迁移用 savepoint;需要“取消后还能恢复”就externalize

5. 屏障快照是如何工作的?

Flink 采用 异步屏障快照(Chandy-Lamport 的变体):

  1. Checkpoint Coordinator(在 JobManager)触发一次 Checkpoint;
  2. Source 记录自己的读取位置(offset)并在输出流中插入带编号的 Checkpoint Barrier
  3. Barrier 随数据流经各算子,标识“屏障之前的数据属于本次快照”;
  4. 算子收到某个编号的屏障时,拍下自己当前状态
  5. 双输入算子(如 CoProcess)会做 屏障对齐:等两侧都到达同一编号的屏障,再进行拍照,保证状态对应到两个输入的同一“时间面”;
  6. 状态后端用 写时复制 实现“边处理、边快照”,老版本状态在后台异步持久化,完成后再清理。

关键点:

  • Barrier 对齐是为了 Exactly-Once
  • 你若只要 At-Least-Once,可关闭对齐以减少等待。

6. Exactly-Once / At-Least-Once 怎么取舍?

Flink 能提供三种端到端语义(取决于你的配置与上下游能力):

实现 端到端 Exactly-Once,还需:

7. 配置模板(拿来就用)

7.1 Java 作业里启用 Checkpoint(示例)

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 开启 Checkpoint(例如每 60 秒)
env.enableCheckpointing(60_000);
// 选择语义:Exactly-Once(默认)或 At-Least-Once
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// 最小间隔/超时/并发等
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30_000);
env.getCheckpointConfig().setCheckpointTimeout(5 * 60_000);
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
// 外部化保留(作业取消时保留)
env.getCheckpointConfig().setExternalizedCheckpointCleanup(
ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
// 配置存储位置(分布式文件系统)
env.getCheckpointConfig().setCheckpointStorage("hdfs://namenode/flink/ckpt");
// (可选)精细 Source/Sink:保证可重放 / 事务或幂等

7.2 flink-conf.yaml(集群级默认)

# 状态后端(二选一)
state.backend: rocksdb              # 或 hashmap
# RocksDB 本地目录
state.backend.rocksdb.localdir: /data/flink/rocksdb
# Checkpoint 存储
state.checkpoints.dir: hdfs://namenode/flink/ckpt
# (可选)Savepoint 默认目录
state.savepoints.dir: hdfs://namenode/flink/savepoints
# Checkpoint 一些通用配置也可在此定义
execution.checkpointing.interval: 60s
execution.checkpointing.timeout: 5min
execution.checkpointing.min-pause: 30s
execution.checkpointing.max-concurrent: 1

生产建议:把目录放到高可用的分布式存储;本地磁盘仅用于 RocksDB 工作状态

8. 性能与稳定性调优清单

RocksDB 后端

  • 大状态优先:享受增量快照与稳定恢复;
  • 合理配置本地目录与磁盘 IOPS;避免与热日志抢盘;
  • 访问模式尽量 MapState/ListState,不要把集合塞 ValueState
  • 控制 key 基数状态 TTL,避免“无界膨胀”。

堆后端(HashMapStateBackend)

  • 给足 堆内存,关注 GC
  • 降低对象碎片:POJO 紧凑、避免过深嵌套;
  • 使用增量聚合(reduce/aggregate)减少窗口全量缓存。

Checkpoint 稳定性

  • 设置 最小间隔超时,避免 Checkpoint 排队或长期悬挂;
  • 控制并发数为 1(多数场景足够稳定);
  • Source/Sink 的事务/幂等策略与 Checkpoint 对齐
  • 监控:Checkpoint 时长、对齐等待、失败率、状态大小、反压。

语义取舍

  • 不需要强一致 → AT_LEAST_ONCE(关闭对齐)换取吞吐;
  • 需要强一致 → EXACTLY_ONCE + 可重放 Source + 事务/幂等 Sink。

9. 常见问题与排查

10. 实战路径建议

  1. 评估状态规模 → 选 RocksDB or Heap
  2. 配置 FileSystemCheckpointStorage(分布式存储);
  3. 开启 Exactly-Once,打通 可重放 Source幂等/事务 Sink
  4. 接通监控:Checkpoint 指标、状态大小、反压、GC;
  5. 在预发布环境注入故障(关 TM、Kill 作业)验证恢复路径;
  6. 上线后观察 Checkpoint 成功率与时长分布,持续调参(间隔/超时/并发/TTL)。

结语

Flink 的容错架构把“状态 + 源位置”一并固化,凭借异步屏障快照在吞吐、延迟与一致性之间找到平衡。理解并正确选择状态后端Checkpoint 存储,区分 Checkpoint / Savepoint / Externalized 的使用场景,再配上端到端 Exactly-Once 的工程落地,你的实时计算就具备了“可恢复、可演进、可验证”的内功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

门户网站属于新媒体吗台州网站建设慕枫

莆田学院录取分数线2020是多少分,各专业录取分数线是多少,是每个填报莆田学院的考生最关注的问题,随着各省高考录取批次相继公布,考生也开始关心是否被录取,本站小编整理相关信息供参考,仅供参考。一、莆田…

兼职做网站赚钱吗网站首页设计图片简约

ChatGPT Admin Web 在团队和组织内共享使用人工智能的一站式解决方案。 ​编辑 ​编辑 ​编辑 CAW 是一个自托管网络应用程序,提供开箱即用的用户管理,包括后台界面以及可配置的支付计划和相关支付界面。 GitHub Sponsor / 爱发电 功能 Features …

【08】海康相机C#开发——在海康MVS的**C#实例中添加控件报错**“`不能在本地化模式下添加组件。在 Language 属性中选择”(默认)”以返回到默认格式,然后添加组件`” - 实践

【08】海康相机C#开发——在海康MVS的**C#实例中添加控件报错**“`不能在本地化模式下添加组件。在 Language 属性中选择”(默认)”以返回到默认格式,然后添加组件`” - 实践2025-09-27 18:47 tlnshuju 阅读(0) 评…

哪个建立网站好个人网上卖货的平台

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 导读: 我们在前面学习了单链表和顺序表,以及栈和队列。 今天我们来学习小堆。 关注博主或是订阅专栏&a…

# Windows CMD 基本指令参考手册

Windows CMD 基本指令参考手册常用命令提示符指令速查指南,包含直接复制功能Windows 命令提示符(CMD)是一个强大的工具,可以让您通过输入命令来执行各种系统操作。本参考手册整理了最常用的 CMD 指令,方便您快速查…

P13019 [GESP202506 八级] 树上旅行

解题思路 这个问题需要在有根树上模拟移动操作,但直接模拟会超时(因为移动次数可能很大)。核心思想是使用二进制提升(Binary Lifting)技术来优化移动过程。 关键观察:向上移动(移动到父节点):可以使用倍增表 …

完整教程:负载均衡式的在线OJ项目编写(二)

完整教程:负载均衡式的在线OJ项目编写(二)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

Java语法基础课程动手动脑及课后实验问题整理文档

一、编程思维与项目分解相关按照“将整个程序分成若干个组件(分解);将多次出现的相似功能设成独立的方法(模式识别、抽象、算法);调试每个独立组件的健壮性(单元测试);按照功能要求进行组件组合(整合);再测…

安装包制作流程-final

1.给项目exe文件添加 管理员权限添加清单文件:在 Visual Studio 中,右键点击你的 WPF 项目,选择“添加” > “新建项”,然后选择“应用程序清单文件 (app.manifest)”并添加。如果已存在该文件,此步骤可省略。…

让YOLO飞起来:从CPU到GPU的配置指南

最近在配置YOLO(You Only Look Once)进行物体检测和图像分割任务时,发现默认安装的情况下,YOLO使用的是CPU进行计算。 这对于需要处理大量图像或实时检测的任务来说,效率明显不足。 本文将详细介绍如何将YOLO从CP…

记录这辈子见到的第一道从上到下的树上倍增

这道题先是浪费我半个下午做,做不出来有时好久看题解实现,气死我了。 题意。 给定一张 \(N\) 点的树,让我们考虑断掉每一条边,统计分裂出的两个子树的重心编号和之和。 要求 \(O(nlogn)\) 或更优的时间复杂度。 做…

忘形篇

忘形篇先想想暴力怎么做

06.容器存储 - 教程

06.容器存储 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…

fm网站开发有源码怎么搭建网站

文章来源:http://blog.csdn.net/edeed/archive/2006/02/10/596271.aspx 1、安装PD v11.0版 2、由pdm生成建表脚本时,字段超过15字符就发生错误(oracle) 原因未知,解决办法是打开PDM后,会出现Database的菜单…

电子商务网站如何进行维护和推广建设部网站官网挂证通报

ARM32位系统的内存布局图 32位操作系统的内存布局很经典,很多书籍都是以32位系统为例子去讲解的。32位的系统可访问的地址空间为4GB,用户空间为1GB ~ 3GB,内核空间为3GB ~ 4GB。 为什么要划分为用户空间和内核空间呢? 一般处理器…

一般路人向第39次CSP认证

一般路人向第39次CSP认证Q1 第一题十分水,照着他意思来就行了,十来分钟写出来交上去,不行。反复确认直到半个小时,发现交到第二题上去了。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int m, n; do…

1748:约瑟夫问题

题目 总时间限制: 1000ms 内存限制: 65536kB 描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样…

做报名统计的网站微门户网站建设

前面两篇文章记录了 Spring IOC 的相关知识&#xff0c;本文记录 Spring 中的另一特性 AOP 相关知识。 部分参考资料&#xff1a; 《Spring实战&#xff08;第4版&#xff09;》 《轻量级 JavaEE 企业应用实战&#xff08;第四版&#xff09;》 Spring 官方文档 W3CSchool Spri…

net网站开发教程简易微网站模板

构造器最大的作用:创建对象. 为什么使用反射创建对象,为什么不直接来new呢? 在框架中,提供给我们的都是字符串. ----------------------------------------------------------- 使用反射创建对象: 步骤: 1);找到构造器所在类的字节码对象. 2):获取构造器对象. 3):使用反射…

安全可信网站营销活动策划方案模板

前言 Python可以用于复杂的数据分析和Web开发项目&#xff0c;还能以极少的代码行数完成令人惊叹的任务。本文将分享25个简短的Python代码示例&#xff0c;用来展示Python编程语言的魅力和效率。 1.列表推导式 Python的列表推导式提供了一种优雅的方法来创建列表。 # 将一个…