Flink之状态之checkpointing
1.前言
在Flink中,函数和操作符都可以是有状态的。在处理每个消息或者元素时,有状态的函数都会储存信息,使得状态成为精密操作中关键的组成部分。
为了使状态能够容错,Flink会checkpoints状态。checkpoints机制使得Flink可以恢复状态和位置,以至于流计算的应用可以提供无故障执行的语义。
2.前提
Flink的checkpointing机制对流和状态的可靠存储有如下两点要求:
- 持久化的数据源能够从某个时间进行消息回放。举个例子,对于消息队列而言,有Kafka,RabbitMQ,Kinesis,PubSub,对文件系统而言,有Hdfs,S3,Ceph等。
- 状态的持久化存储。一般会保存在分布式文件系统中,比如HDFS和S3。
3.启用和配置Checkpointing
Flink默认不启用Checkpointing。如果要启用,可以在StreamExecutionEnvironment上调用enableCheckpointing(n),其中n是以毫秒为单位的checkpoint间隔。
还有其他一些参数:
- exactly-once vs at-least-once:在enableCheckpointing(n)中可以传递模式,对于大多数应用可能exactly-once适合,但对于延迟要求在毫秒级别的,或许也可以设置为at-least-once。
- checkpoint timeout:如果超过这个时间checkpoint还没结束,就会被认为是失败的。
- minimum time between checkpoints:规定在两次checkpoints之间的最小时间是为了流应用可以在此期间有明显的处理进度。比如这个值被设置为5秒,则在上一次checkpoint结束5秒之内不会有新的checkpoint被触发。这也通常意味着checkpoint interval的值会比这个值要大。为什么要设置这个值?因为checkpiont interval有时候会不可靠,比如当文件系统反应比较慢的时候,checkpiont花费的时间可能就比预想的要多,这样仅仅只有checkpoint interval的话就会重叠。记住,设置minimum time between checkpoints也要求checkpoints的并发度是1。
- number of concurrent checkpoints:默认,Flink在有一个checkpoint在执行的时候不会触发另一次checkpoint。但如果非要做,比如对于处理有延迟的流水线操作而言,又希望能够高频的进行checkpoint,则可以更改这个值。如果设置了minimum time between checkpoints,就不要设置这个值。
- externalized checkpoints:externalized checkpoints将元数据也会写入持久化存储,并且在作业失败的时候不会自动清除数据。这样,你就获得了作业失败之后的一个恢复点。
- fail/continue task on checkpoint errors:这个值规定当某次checkpoint执行失败的时候,task是否要被认为是执行失败。Flink默认checkpoint失败则task处理失败。但是你可以改,如果改了,那么checkpoint失败的时候,task还会继续运行,只是会告诉checkpoint协调器这次checkpoint失败了。
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // start a checkpoint every 1000 ms
env.enableCheckpointing(1000); // advanced options: // set mode to exactly-once (this is the default)
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); // make sure 500 ms of progress happen between checkpoints
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500); // checkpoints have to complete within one minute, or are discarded
env.getCheckpointConfig().setCheckpointTimeout(60000); // allow only one checkpoint to be in progress at the same time
env.getCheckpointConfig().setMaxConcurrentCheckpoints(1); // enable externalized checkpoints which are retained after job cancellation
env.getCheckpointConfig().enableExternalizedCheckpoints(ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION);
相关的配置选项
| Key | Default | Description |
|---|---|---|
state.backend |
(none) | The state backend to be used to store and checkpoint state. |
state.backend.async |
true | Option whether the state backend should use an asynchronous snapshot method where possible and configurable. Some state backends may not support asynchronous snapshots, or only support asynchronous snapshots, and ignore this option. |
state.backend.fs.memory-threshold |
1024 | The minimum size of state data files. All state chunks smaller than that are stored inline in the root checkpoint metadata file. |
state.backend.incremental |
false | Option whether the state backend should create incremental checkpoints, if possible. For an incremental checkpoint, only a diff from the previous checkpoint is stored, rather than the complete checkpoint state. Some state backends may not support incremental checkpoints and ignore this option. |
state.backend.local-recovery |
false | |
state.backend.rocksdb.localdir |
(none) | The local directory (on the TaskManager) where RocksDB puts its files. |
state.checkpoints.dir |
(none) | The default directory used for storing the data files and meta data of checkpoints in a Flink supported filesystem. The storage path must be accessible from all participating processes/nodes(i.e. all TaskManagers and JobManagers). |
state.checkpoints.num-retained |
1 | The maximum number of completed checkpoints to retain. |
state.savepoints.dir |
(none) | The default directory for savepoints. Used by the state backends that write savepoints to file systems (MemoryStateBackend, FsStateBackend, RocksDBStateBackend). |
taskmanager.state.local.root-dirs |
(none) |
4.选择存储策略
Flink的checkpointing机制会存储状态的一致性快照,配置了不同的状态存储策略,checkpoints就会保存在不同的地方,比如JM的内存,文件系统还是数据库。
默认,状态会保存在TM的内存中,checkpoints会保存在JM的内存中。但是为了保存特别大的状态,Flink也支持将状态保存和checkpointing到其他的地方。
5.迭代作业中的状态保存点
Flink目前只对没有迭代的作业提供处理保证。在迭代作业中进行checkpointing会导致异常发生,如果用户强制要在迭代应用中启用checkpoint,则需要设置env.enableCheckpointing(interval, force = true),但这也不能保证处在循环边界上的数据和状态不会丢失。
6.重启策略
Flink支持很多重启策略,比如Fixed Delay Restart Strategy,Failure Rate Restart Strategy,No Restart Strategy,Fallback Restart Strategy,容后再叙。
7.checkpoints
与savepoints的区别
- 数据结构,savepoints有自己的数据结构,checkpoints的数据结构和状态的存储结构相同。
- 触发方式,savepoints只能对状态进行全量快照保存,checkpoints可以对状态的快照进行增量快照处理。
- 应用并发,savepoints支持应用并发的调整,checkpoints不支持调整。
Flink之状态之checkpointing的更多相关文章
- Flink的状态与容错
本文主要运行到Flink以下内容 检查点机制(CheckPoint) 状态管理器(StateBackend) 状态周期(StateTtlConfig) 关系 首先要将state和checkpoint概 ...
- Flink Streaming状态处理(Working with State)
参考来源: https://www.jianshu.com/p/6ed0ef5e2b74 https://blog.csdn.net/Fenggms/article/details/102855159 ...
- Flink之状态之savepoint
1.总览 savepoints是外部存储的自包含的checkpoints,可以用来stop and resume,或者程序升级.savepoints利用checkpointing机制来创建流式作业的状 ...
- Flink之状态之状态存储 state backends
流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...
- 「Flink」Flink的状态管理与容错
在Flink中的每个函数和运算符都是有状态的.在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作.为了让状态容错,Flink需要设置checkpoint状态.Flink程序是通过chec ...
- 9、flink的状态与容错
1.理解State(状态) 1.1.State 对象的状态 Flink中的状态:一般指一个具体的task/operator某时刻在内存中的状态(例如某属性的值) 注意:State和Checkpoint ...
- flink 有状态udf 引起血案一
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/83422587 场景 近期在做一个画像的 ...
- Flink之状态之状态获取
1.什么是状态 对于任何一个操作,都可以被看成是一个函数,比如y=f(x),如果对于同一个x的任何一次输入,得到的y都是相同的,则可以认为这个函数是无状态,否则,这个函数就是有状态的.Flink的一大 ...
- flink checkpoint状态储存三种方式选择
Flink 提供了三种可用的状态后端:MemoryStateBackend,FsStateBackend,和RocksDBStateBackend. MemoryStateBackend Memory ...
随机推荐
- 『ACM C++』 PTA 天梯赛练习集L1 | 001-006
应师兄要求,在打三月底天梯赛之前要把PTA上面的练习集刷完,所以后面的时间就献给PTA啦~ 后面每天刷的题都会把答案代码贡献出来,如果有好的思路想法也会分享一下~ 欢迎大佬提供更好的高效率算法鸭~ - ...
- Mac系统升级后在终端输入git命令时遇到的问题
Mac系统升级git会找不到并且报错:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools) ...
- iOS 开发中保留小数问题
保留两位小数(四舍五入) - (void)viewDidLoad { [super viewDidLoad]; // 有时候我们需要对数据保留两位小数,而且需要四舍五入,并且需要把末尾多余的0给去掉\ ...
- svg在html的使用
<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <defs&g ...
- 【Thrift一】Thrift安装部署
Thrift安装部署 Thrift安装部署 下载源码包 安装g++ 解压Thrift安装包 安装boost开发工具 测试(python版) 下载源码包 wget http://apache.fayea ...
- python生成器详解
1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...
- Leecode刷题之旅-C语言/python-88合并两个有序数组
/* * @lc app=leetcode.cn id=88 lang=c * * [88] 合并两个有序数组 * * https://leetcode-cn.com/problems/merge-s ...
- sqoop 的使用 -20160410
1 导入导出数据库 1)列出mysql数据库中的所有数据库命令 # sqoop list-databases --connect jdbc:mysql://localhost:3306/ - ...
- java Spring boot使用spring反射
spring 反射 当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行. 1.可以通过类名去实例 ...
- Python操作nosql数据库之redis
一.NoSQL的操作 NoSQL,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不 ...