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的更多相关文章

  1. Flink的状态与容错

    本文主要运行到Flink以下内容 检查点机制(CheckPoint) 状态管理器(StateBackend) 状态周期(StateTtlConfig) 关系 首先要将state和checkpoint概 ...

  2. Flink Streaming状态处理(Working with State)

    参考来源: https://www.jianshu.com/p/6ed0ef5e2b74 https://blog.csdn.net/Fenggms/article/details/102855159 ...

  3. Flink之状态之savepoint

    1.总览 savepoints是外部存储的自包含的checkpoints,可以用来stop and resume,或者程序升级.savepoints利用checkpointing机制来创建流式作业的状 ...

  4. Flink之状态之状态存储 state backends

    流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...

  5. 「Flink」Flink的状态管理与容错

    在Flink中的每个函数和运算符都是有状态的.在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作.为了让状态容错,Flink需要设置checkpoint状态.Flink程序是通过chec ...

  6. 9、flink的状态与容错

    1.理解State(状态) 1.1.State 对象的状态 Flink中的状态:一般指一个具体的task/operator某时刻在内存中的状态(例如某属性的值) 注意:State和Checkpoint ...

  7. flink 有状态udf 引起血案一

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/83422587 场景 近期在做一个画像的 ...

  8. Flink之状态之状态获取

    1.什么是状态 对于任何一个操作,都可以被看成是一个函数,比如y=f(x),如果对于同一个x的任何一次输入,得到的y都是相同的,则可以认为这个函数是无状态,否则,这个函数就是有状态的.Flink的一大 ...

  9. flink checkpoint状态储存三种方式选择

    Flink 提供了三种可用的状态后端:MemoryStateBackend,FsStateBackend,和RocksDBStateBackend. MemoryStateBackend Memory ...

随机推荐

  1. ABAP术语-Authorization Object

    Authorization Object 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/20/1006585.html Element of ...

  2. ubuntu系統如何啟動root用戶登陸?

    之前分享過關於這個問題的文章,現在自己在分享一個關於這個問題的文章給大家.為了學習Linux,一氣之下把win10的換成了ubuntu的系統.安裝就不給大家介紹了(網上很多教程). 在我們安裝好之後, ...

  3. 《高性能MySQL》笔记——MySQL建表数据类型的选择

    前段时间看了<高性能MySQL>中的选择优化的数据类型,这里主要是做一下笔记. 首先数据选择有几个简单原则: 更小的通常更好.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.例如只 ...

  4. typecho博客组插件:openSug.js百度搜索框下拉提示免费代码

      Typecho候选搜索增强插件:安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让Typecho搜索更便捷! 支持百度.谷歌.雅虎.Yandex.360好搜.UC神马.酷狗.优酷.淘 ...

  5. scala成长之路(1)基本语法和数据类型

    scala作为JVM上的Lisp,是一种geek类型的编程语言,也一直是我等java程序员眼中的梦寐以求的一门技能,遂下定决心花一段时间好好学习scala.第一天学习,主要介绍与java在编程上的主要 ...

  6. JS基础知识-01

    01-浅谈前端发展史 第一阶段:C/S(client server)->B/S(browser server) 网页制作 技术栈:PhotoShop.HTML.CSS 第二阶段:从静态到动态,从 ...

  7. flask的自定义过滤器

    过滤器的本质是函数.当模板内置的过滤器不能满足需求,可以自定义过滤器.自定义过滤器有两种实现方式: 一种是通过Flask应用对象的 add_template_filter 方法 通过装饰器来实现自定义 ...

  8. zabbix监控MySQL服务状态

    Mysql模板使用 在zabbix_agent配置文件中加入监控配置 vim etc/zabbix_agentd.conf ... UserParameter=mysql.version,mysqla ...

  9. (数据科学学习手札24)逻辑回归分类器原理详解&Python与R实现

    一.简介 逻辑回归(Logistic Regression),与它的名字恰恰相反,它是一个分类器而非回归方法,在一些文献里它也被称为logit回归.最大熵分类器(MaxEnt).对数线性分类器等:我们 ...

  10. 动态规划----FatMouse’s Speed(HDU 1160)

    参考:https://blog.csdn.net/u012655441/article/details/64920825 https://blog.csdn.net/wy19910326/articl ...