当前位置: 首页 > news >正文

flink状态和检查点

检查点和状态后端的区别

  1. 检查点 就是某个时间点下的所有算子的状态快照。这个时间点就是等所有任务将“同一个数据”处理完毕的时候。

  2. 状态后端:是一个管理状态的组件,还负责将本地状态(检查点)持久化到远程文件存储系统中。

分类:

​ (1) 基于内存的hashmap状态后端。性能高,但是有内存资源耗尽的风险

​ (2) 基于rocksdb持久化存储的状态后端。适用于状态大,窗口长的情况下,因为会序列化和反序列化,访问状态的性能会差点。

我们用就是rocksdb状态后端。

检查点的存储:

  1. jobManager的堆(heap)内存中

  2. 文件系统

具体实现接口:

​ (1) 大状态持久化保FileSystemCheckpointStorage:

​ (2) 性能考虑jobManagerCheckpintStorage

检查点的工作流程:

  1. 保存source 算子的数据偏移量,一般保存在hdfs外部文件存储

同时向数据流中插入一种特殊数据: 分界线,当遇到keyby这种分区算子,保存状态同时,会将分界线以广播形式分发给下游并行的算子;如果遇到sum这种,会接收上游多个分区的分界线数据,会进行分界线对齐(详细来讲:Sum算子接收两个不同的子任务的数据,收到了第一子任务的分界线数据,但是没收到第二个子任务的分界线数据,这时候如果第二个子任务传来正常的数据需要正常处理的,但是如果是第一个分界线已经到达的子任务再来数据,就需要等待写入缓存,只有第二子任务的分界线数据到达,然后状态保存,再做处理。

),现在版本的flink已经支持不对齐的检查点,会降低反压时候的checkpoint的执行时间,不过需要保存分界线来之前的数据,所以会增大单个checkpoint的大小。

  1. 然后故障重启后,flink 会读取最近一次的checkpint中的状态,使得各算子恢复到故障前最近一次保存成功的状态。同时source算子会重置数据偏移量,重新消费一遍数据。

精准一次性保证,就是不会重复消费数据,也不会丢失数据。Flink 是通过检查点保证的。

输出端的精准一次如何保证:

  1. 幂等写入(无论执行多少次,最终结果都一样),如果写入redis 这种键值对存储,数据重复写入,对结果不影响。还有写入mysql 按主键更新数据。

  2. 还有就是事务写入,将事务与检查点绑定在一起,通过检查点是否成功来提交或者回滚事务。具体来说就是,对不同的外部存储系统,有两种实现方式:

    1. 对于不支持事务的外部存储系统,可通过预写日志的方式(实现GenericWriteAheadSink),就是将结果数据作为日志保存起来,检查点保存后,将日志也临时持久化存储一下,等jobmanager收到所有任务成功checkpoint完成消息后,再将结果数据批处理写入外部系统。缺陷:数据写入外部系统时,flink会确认保存成功的消息,如果就在确认返回消息时发生故障时,这时checkpoint都成功了,但是数据也写入外部存储系统了,且不支持事务,所以等故障重启时会造成数据重复写入。
    2. 对于支持事务外部存储系统,可用两阶段提交(two phase commit ; 2pc)的方式(twoPhaseCommitSinkFunction接口,例如:flinkKafkaProducer实现了这个接口),可以真正保证精准一次。具体来说:sink任务会在两种情况下开启一个新事务(对外部存储系统),1. 第一条数据来到;2. 分界线数据来到。开启后,所有的结果数据都会通过事务写入到这个外部系统,虽然已经写入到外部存储,但是以为事务的原因,这些数据不可用,也就是预提交的状态。当所有的算子的快照都保存好后,jobmanger会发出确认完成的通知给sink任务,这时候sink任务会正式提交事务。两阶段提交完成。假如任何时候发生故障,可通过这个未提交的事务,对已写入的数据进行回滚。

相关文章:

  • Xcode15 framework ‘CoreAudioTypes‘ not found
  • OTP语音 NV040C芯片在智能闹钟的应用
  • Mac安装opencvJava踩坑
  • VS Code Counter统计代码量(vscode扩展工具)
  • linux开机自动挂载目录
  • 怎么学编程效率高,编程练习网站编程软件下载,中文编程开发语言工具下载
  • 高防IP的原理
  • 〔001〕虚幻 UE5 安装教程
  • libwebsockets入门
  • 02|LangChain | 从入门到实战 -六大组件之Models IO
  • C++入门学习(1)命名空间和输入输出
  • 数据结构(c语言版) 队列
  • Docker从入门到上天系列第二篇:传统虚拟机和容器的对比以及Docker的作用以及所解决的问题
  • 《代码整洁之道》读书笔记(一)
  • 数据库基础面试——索引
  • Angular4 模板式表单用法以及验证
  • C语言笔记(第一章:C语言编程)
  • docker-consul
  • JS 面试题总结
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • magento 货币换算
  • MaxCompute访问TableStore(OTS) 数据
  • mysql 数据库四种事务隔离级别
  • mysql中InnoDB引擎中页的概念
  • session共享问题解决方案
  • 对JS继承的一点思考
  • 翻译:Hystrix - How To Use
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 入口文件开始,分析Vue源码实现
  • 算法-图和图算法
  • 一起参Ember.js讨论、问答社区。
  • 一些关于Rust在2019年的思考
  • 赢得Docker挑战最佳实践
  • linux 淘宝开源监控工具tsar
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • #{}和${}的区别是什么 -- java面试
  • $refs 、$nextTic、动态组件、name的使用
  • (39)STM32——FLASH闪存
  • (Java)【深基9.例1】选举学生会
  • (二十四)Flask之flask-session组件
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (离散数学)逻辑连接词
  • (力扣)1314.矩阵区域和
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)创业的注意事项
  • ******之网络***——物理***
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net 垃圾回收机制原理(二)
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net下的富文本编辑器FCKeditor的配置方法
  • .net中生成excel后调整宽度
  • [ 数据结构 - C++] AVL树原理及实现
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器