浅谈Flink基于RocksDB的增量检查点机制_flink rocksdb增量-程序员宅基地

技术标签: Flink  

Intro

Flink之所以能够做到高效而准确的有状态流式处理,核心是依赖于检查点(checkpoint)机制。当流式程序运行出现异常时,能够从最近的一个检查点恢复,从而最大限度地保证数据不丢失也不重复。

Flink检查点本质上是通过异步屏障快照(asychronous barrier snapshot, ABS)算法产生的全局状态快照,一般是存储在分布式文件系统(如HDFS)上。但是,如果状态空间超大(比如key非常多或者窗口区间很长),检查点数据可能会达到GB甚至TB级别,每次做checkpoint都会非常耗时。但是,海量状态数据在检查点之间的变化往往没有那么明显,增量检查点可以很好地解决这个问题。顾名思义,增量检查点只包含本次checkpoint与上次checkpoint状态之间的差异,而不是所有状态,变得更加轻量级了。

From https://www.slideshare.net/FlinkForward/stephan-ewen-scaling-to-large-state

Incremental CP on RocksDB Backend

目前Flink有3种状态后端,即内存(MemoryStateBackend)、文件系统(FsStateBackend)和RocksDB(RocksDBStateBackend),只有RocksDB状态后端支持增量检查点。该功能默认关闭,要打开它可以在flink-conf.yaml中配置:

 

state.backend: rocksdb
state.backend.incremental: true

或者在代码中配置:

 

RocksDBStateBackend rocksDBStateBackend = new RocksDBStateBackend("hdfs://path/to/flink-checkpoints", true);
env.setStateBackend(rocksDBStateBackend);

为什么只有RocksDB状态后端支持增量检查点呢?这是由RocksDB本身的特性决定的。RocksDB是一个基于日志结构合并树(LSM树)的键值式存储引擎,它可以视为HBase等引擎的思想基础,故与HBase肯定有诸多相似之处。如果看官不了解LSM树的话,可以通过笔者之前写的这篇文章来做个简单的了解。

在RocksDB中,扮演读写缓存的角色叫做memtable。memtable写满之后会flush到磁盘形成数据文件,叫做sstable(是“有序序列表”即sorted sequence table的缩写)。RocksDB也存在compaction策略,在后台合并已经写入的sstable,原有的sstable会包含所有的键值对,合并前的sstable在此后会被删除。关于compaction,笔者写了一篇非常详细的文章来探讨,见这里

在启用RocksDB状态后端后,Flink的每个checkpoint周期都会记录RocksDB库的快照,并持久化到文件系统中。所以RocksDB的预写日志(WAL)机制可以安全地关闭,没有重放数据的必要性了。

From https://www.slideshare.net/dataArtisans/webinar-deep-dive-on-apache-flink-state-seth-wiesman

Illustrating Incremental CP

有了上面的铺垫,下面通过例子来解释增量检查点的过程。

From https://flink.apache.org/features/2018/01/30/incremental-checkpointing.html

上图示出一个有状态的算子的4个检查点,其ID为2,并且state.checkpoints.num-retained参数设为2,表示保留2个检查点。表格中的4列分别表示RocksDB中的sstable文件,sstable文件与存储系统中文件路径的映射,sstable文件的引用计数,以及保留的检查点的范围。

下面按部就班地解释一下:

  1. 检查点CP 1完成后,产生了两个sstable文件,即sstable-(1)与sstable-(2)。这两个文件会写到持久化存储(如HDFS),并将它们的引用计数记为1。
  2. 检查点CP 2完成后,新增了两个sstable文件,即sstable-(3)与sstable-(4),这两个文件的引用计数记为1。并且由于我们要保留2个检查点,所以上一步CP 1产生的两个文件也要算在CP 2内,故sstable-(1)与sstable-(2)的引用计数会加1,变成2。
  3. 检查点CP 3完成后,RocksDB的compaction线程将sstable-(1)、sstable-(2)、sstable-(3)三个文件合并成了一个文件sstable-(1,2,3)。CP 2产生的sstable-(4)得以保留,引用计数变为2,并且又产生了新的sstable-(5)文件。注意此时CP 1已经过期,所以sstable-(1)、sstable-(2)两个文件不会再被引用,引用计数减1。
  4. 检查点CP 4完成后,RocksDB的compaction线程将sstable-(4)、sstable-(5)以及新生成的sstable-(6)三个文件合并成了sstable-(4,5,6),并对sstable-(1,2,3)、sstable-(4,5,6)引用加1。由于CP 2也过期了,所以sstable-([1~4])四个文件的引用计数同时减1,这就造成sstable-(1)、sstable-(2)、sstable-(3)的引用计数变为0,Flink就从存储系统中删除掉这三个文件。

通过上面的分析,我们可以看出Flink增量检查点机制的巧妙之处:

  • 通过跟踪sstable的新增和删除,可以记录状态数据的变化;
  • 通过引用计数的方式,上一个检查点中已经存在的文件可以直接被引用,不被引用的文件可以及时删除;
  • 可以保证当前有效的检查点都不引用已经删除的文件,从而保留state.checkpoints.num-retained参数指定的状态历史。

What to Concern...

增量检查点解决了大状态checkpointing的问题,但是在从检查点恢复现场时会带来潜在的overhead。这是显然的:当程序出问题后,TaskManager需要从多个检查点中加载状态数据,并且这些数据中还可能会包含将被删除的状态。

还有一点,就算磁盘空间紧张,旧检查点的文件也不能随便删除,因为新检查点仍然会引用它们,如果贸然删除,程序就无法恢复现场了。这就提示我们,如果状态本身的数据量不大,并且状态之间的overlap也不明显的话,开启增量检查点可能会造成反效果(checkpoint数据量异常膨胀),所以应该按需使用。

The End

明天还要继续搬砖,民那晚安。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nazeniwaresakini/article/details/104220180

智能推荐

Struts 2 概要说明_struts 2 starter是什么-程序员宅基地

文章浏览阅读8.6k次。概要也 许每一本关于技术的书都应该有一个叫做HelloWorld的示例,应为这非常直观的表现了技术的特性。这本书也不特殊,在这一节中主要涉及一些 Strut 2 的基本特性的说明,包括,如何下载建立开发工程,一个Hello World JSP表示页面,使用标签,建立Action类,选择结果类型,校验输入数据,本地化输出。最后会给出一个包含上述特性的示例:用户登录需要了解的技术 Jav_struts 2 starter是什么

在一个无向图中找环_无向图找环算法-程序员宅基地

文章浏览阅读4.8k次,点赞3次,收藏13次。在一个无向图中找环PART1:DFSApproach:从每个未访问的节点运行 DFS。深度优先遍历可用于检测图中的循环。连通图的 DFS 生成一棵树。仅当图中存在回边Back Edge:从一个顶点指向其祖先顶点的边时,图中才存在环。回边Back Edge是将节点连接到自身(自循环)或其在 DFS 生成的树中的祖先之一的边。要找到其任何祖先的回边Back Edge,保留一个访问过的数组,如果任何访问过的节点都有回边Back Edge,则存在一个循环并返回 true。Algorithm:使用给定_无向图找环算法

Cannot run program "/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java"_java: cannot run program "/users/linxie/documents/-程序员宅基地

文章浏览阅读9.7k次。Cannot run program "/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java" 有种情况是 项目路径下 存在中文_java: cannot run program "/users/linxie/documents/installed/j2sdk1.7.0.79/bi

2021年后国内互联网发展趋势预测_未来中国互联网发展处于什么阶段-程序员宅基地

文章浏览阅读2.2k次。  现在是【2020年12月23日】,距离我入行搜索引擎推广6个年头了。现在我基本可以确信,个人站长未来的路断绝了。准确的说,是想通过个人建站,百度、360等搜索引擎关键词引流从而获取足够的流量,最终流量变现实现盈利这条路基本断了。不在抱有任何幻想!  还记得刚入行哪会儿,在搜外是有多热闹啊!现在呢,连百度自己的站长论坛都没人发帖了,大数据时代真正来临了。百度通过大数据算法,把百度接近80%-90%的流量分发给了自己的产品。  都在说,要努力做内容!可问题是真正某个专业领域的人他未必就是个站长,.._未来中国互联网发展处于什么阶段

vue element ui Loading 加载,排序等功能_elementui loading 异步等待渲染顺序-程序员宅基地

文章浏览阅读419次。element ui Loading 加载,排序等功能_elementui loading 异步等待渲染顺序

AndroidR 截屏流程分析_renderscreenimpllocked-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏7次。缘起最近App开发同事提出了一个需求,需要系统团队提供一个截屏的时候,可以过滤一些特定Layer中的内容,我这顺便记录一下调试过程。流程截屏流程一般通过 SurfaceControl.screenshot(frame, dw, dh, false, ROTATION_0);函数返回一个bitmap的图片。参数包含裁剪区域sourceCrop 和旋转角度。frameworks/base/core/java/android/view/SurfaceControl.javapublic static _renderscreenimpllocked

随便推点

基于OpenCV的PHP图像人脸识别技术_opencv php 人脸识别-程序员宅基地

文章浏览阅读1.4w次。本文所介绍的技术不是原创,而是从一个叫Robert Eisele的德国人那里学习来的。他写了一个PHP扩展openCV,只封装了两个函数,叫face_detect和face_count。 openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全。本文重点是介绍如何使用php来调用其中的局部的功能。人脸侦查技术只是openCV一个应用分支。OpenCV安装之前必须依赖_opencv php 人脸识别

java date类1900,java.util.Date类中的getYear()方法-程序员宅基地

文章浏览阅读429次。/*** Returns a value that is the result of subtracting 1900 from the* year that contains or begins with the instant in time represented* by this Date object, as interpreted in the local* time zone.** ..._normalize().getyear() - 1900;

小米运动手环数据导出_小米手环专注导出-程序员宅基地

文章浏览阅读1.9w次,点赞11次,收藏57次。小米手环记录了步数睡眠等信息,可以通过小米运动app在手机上查看,但是并未提供导出接口,如果想自己进行数据统计则需要采取一些手段。本文将介绍具体手段。0 数据文件无法查看当小米手环与手机连接后,小米运动会自动把手环中的数据导入到手机中,存储在小米运动存储的位置,但对大多数手机来说,无法直接看到数据文件,只能通过root等手段查看。但这并不影响我们将数据导出,但需要手机具有备份功能,小米运动a..._小米手环专注导出

Rocky Linux Docker安装_rocky linux 8.9 安装docker-程序员宅基地

文章浏览阅读2k次。Rocky Linux属于CentOS 8联网nmcli c reloadnmcli c up ens33安装Dockeryum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install docker-ce -ysystemct._rocky linux 8.9 安装docker

解决/usr/bin/ld: cannot find -lmysqlclient错误_/usr/bin/ld: cannot find -lmysqlclient 64-程序员宅基地

文章浏览阅读1.8k次。类似/usr/bin/ld: cannotfind -xxxx的错误有很多, 首先我们可以最简单的判断一下:这类情况一般是由于缺乏某某库文件, 又或者可能是由于已存在的库问题版本不对造成的一般都是解决的办法就是安装缺乏的devel包就可以解决, 当然还有其他的未知因素, 我们看一个实例:我在一台装centos5.2 x86_64的系统上配置php环境, 提示这个错误"/usr/bi_/usr/bin/ld: cannot find -lmysqlclient 64

Linux中分区配额的设置,LVM逻辑卷的建立、扩展、压缩、删除_/dev/vdb1 2048 2099199 1048576 8e linux lvm-程序员宅基地

文章浏览阅读1.7k次。一、 配 额 超级用户[root@localhost ~]# fdisk /dev/vdb #新建一个分区[root@localhost ~]# mkfs.xfs /dev/vdb1 #格式化[root@localhost ~]# mount -o usrquota /dev/vdb1 /mnt [root@localhost ~]# chmod 7..._/dev/vdb1 2048 2099199 1048576 8e linux lvm

推荐文章

热门文章

相关标签