返回顶部
首页 > 资讯 > 数据库 >「Flink」Flink的状态管理与容错
  • 386
分享到

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

「Flink」Flink的状态管理与容错 2019-08-30 07:08:26 386人浏览 无得
摘要

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

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

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

checkpoint检查点

前提条件

Flink的checkpoin机制需要与流和状态的持久化存储交互,一般它要求:

  • 一个持久化的数据源
    • 当Flink程序出现问题时,可以通过checkpoint持久化存储中恢复,然后从出错的地方开始重新消费数据
    • 该数据源可以在一定时间内重跑数据,例如:kafkaRabbitMQ或者文件系统hdfs、S3、…
  • 状态的持久存储
    • 状态需要永久的保存下来,通常是分布式文件系统(例如:HDFS、S3、GFS、…)

启用和配置检查点

默认情况,Flink是禁用检查点。要启用检查点,调用

// 启用检查点
// 单位:毫秒
env.enableCheckpointing(1000);

在启用检查点时,还可以配置检查点的其他参数。

  • exactly-one or at-least-once(仅一次或者至少一次)
    • 大多数程序都是设置为exactly-once,只有在某些超低延迟的应用(例如:始终要求是毫秒级的应用)
    • 通过查看源码,我们看到,Flink默认是 exactly-once
      • public static final CheckpointingMode DEFAULT_MODE = CheckpointingMode.EXACTLY_ONCE;
  • checkpoint timeout(检查点超时时间)
    • 检查点超过规定的时间就会自动终止
  • minimum time between checkpoints
    • 检查点之间的最小时间
    • 下一个检查点将在上一个检查点完成后5秒钟启动
    • 检查点最小间隔时间不会受检查点间隔更容易配置
  • number of concureent checkpoint
    • 检查点的并发数目。默认情况一个检查点在运行时不会触发另一个检查点,这样可以确保Flink不会花太多时间在checkpoint上,并确保流可以有效进行。
    • 可以设置多个重叠的checkpoint,这对容许有一定延迟,并希望较频繁的检查(100ms)来重新处理故障是有用的
  • externalized checkpoint
    • 外部检查点
    • 可以将检查点设置为外部持久化,这样检查点的元数据将写入持久存储,并且但作业运行失败是不会自动清理
    • 这样可以做双重保险
  • fail/continue task on checkpoint errors
    • 检查点执行发生错误,是否执行任务。
    • 默认情况,如果checkpoint失败,任务也将失败
  • perfer checkpoint for recovery
    • 即时最近有更多的savepoint可用于恢复,flink依然会选择使用最近一次的checkpoint来进行错误恢复

参考配置:

        // --------
        // 配置checkpoint
        // 启用检查点
        env.enableCheckpointing(1000);
        env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
        env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);
        env.getCheckpointConfig().setCheckpointTimeout(60000);
        env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);
        env.getCheckpointConfig().enableExternalizedCheckpoints(CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATioN);
        env.getCheckpointConfig().setPreferCheckpointForRecovery(true);

选择状态后端存储

Flink的checkpoint机制可以存储计时器和有状态operation的所有快照,包括:连接器、窗口或者用户自定义状态。具体checkpoint存储在哪儿(例如:是JobManager内存、文件系统或者数据库),依赖于状态后端的配置。

默认情况,状态保存在TaskManager的内存中,检查点存储在TM的内存中。为了适当地保存大状态,Flink支持其他的存储。我们可以通过:

StreamExecutionEnvironment.setStateBackend(…)

来指定存储方式

Flink状态管理

状态的应用场景:

  • 当应用程序想要按照某种模式搜索某些事件时,状态可以保存迄今所有的事件序列
  • 当每分钟/小时/天需要对流数据进行聚合,状态可以保存挂起的聚合
  • 当在数据流上训练机器学习模型时,状态可以用来保存某一类参数的版本
  • 当需要管理历史数据时,状态允许访问过去历史数据

Flink状态可以保存在堆内、或者是堆外。Flink也可以管理应用程序的状态,必要时也可以溢出到磁盘,如果应用要保持非常大的状态,可以不修改程序逻辑情况下配置状态后端存储。

Flink状态分类

Flink中有两种基本的状态:

  • Keyed State
  • Operator State

Keyed State

Keyed State通常和key相关,仅仅在KeyedStream的方法和算子中使用。可以把 Keyed State看作是分区,而且每一个key仅出现在一个分区内。逻辑上每个 keyed-state和唯一元组<算子并发实例, key>绑定,由于每个key仅属于算子的一个并发,因此可以简化为<算子, key>

Operator State

对于 Operator State来说,每个Operator State和一个并发实例绑定。Kafka connector是Flink中使用operator state的一个很好的示例。每个Kafka消费者的并发在Operator State中维护一个 topic partition到offset的映射关系。

Operator state在Flink作业的并发改变后,会重新分发状态,分发的策略和keyed stated不一样。

Raw State与Managed State

Keyed Stated和Operator State分别有两种形式:managed 和 raw

Managed State是由Flink运行时管理的数据结构来表示的,例如:内部的Hash Table或者RocksDB。例如:ValueState、ListState等。Flink运行时会对这些状态进行编码并写入Checkpoint。

Raw State则保存在自己的数据结构中。checkpoint的时候,Flink并不知道状态里面具体的内容,仅仅写入一串字节序列到checkpoint中。

所有的DataStream的function都可以使用managed state,但raw state只能在实现算子时使用。由于Flink可以在修改并发时更好的分发状态数据,并且能够更好的管理内存,因为讲义使用 managed state.

使用Managed Keyed State

Managed keyed state接口提供不同类型的状态访问接口,这些状态都作用在当前输入数据的key下。这些状态仅可在KeyedStream上使用,可以通过 stream.keyBy(…)得到KeyedStream。

所有支持的状态类型如下:

  • ValueState
    • 保存一个可以更新和获取的值,算子接收到的每个key都可能对应一个值
    • 可以通过update(T)进行更新,通过value()获取
  • ListState
    • 保存一个元素的列表,可以往这个列表中追加数据,并在当前列表上检索
    • 可以通过 add(T)或者addAll(List)进行追加元素
    • 通过get()获取整个列表
    • 通过 update(List)覆盖当前列表
  • ReducingState
    • 保存一个单值,表示添加到状态的所有值的聚合。接口与ListState类似
  • AggregatingState
    • 保存一个单值,表示添加到状态的所有值的聚合
    • 与ReducingState相反的是,聚合类型可能与添加到状态的元素类型不同。接口与ListState类似
  • FoldingState(后续将过期)
    • 保存一个单值,白搜狐添加到状态的所有值的集合
    • 与ReducingState相反的是,聚合类型可能与添加到状态的元素类型不同。接口与ListState类似
  • MapState
    • 维护一个映射列表,可以添加键值到状态中,可以获取当前映射的迭代器
    • 使用put、putAll添加映射,使用 get检索特定key

注意:

  • 这些状态对象仅用于状态交互。状态本身不一定存储在内存中,还有可能保存在磁盘或者其他位置
  • 从状态中获取的值取决于输入元素说代表的key,因此,在不同key上调用同一个接口,可能得到不同的值

使用Managed Operator State

可以通过实现 CheckpointedFunction 或者 ListCheckpointed接口来使用Managed Operator State。

CheckpointedFunction接口:

void snapshotState(FunctionSnapshotContext context) throws Exception;
void initializeState(FunctionInitializationContext context) throws Exception;

在Flink进行checkpoint时,会调用snapshotstate(),用户自定义函数初始化时会调用 initializeState。初始化包括第一次自定义函数初始化和从之前的 checkpoint 回复。因此,initializeState 中应该也包括状态恢复的逻辑。

Managed Operator State以list的形式存在,这些状态是一个可序列化对象的集合List,彼此独立,方便在改变并发后进行状态的重新分派。换句话说,这些对象是重新分配 non-keyed state的最细粒度。根据状态的不同访问方式,有以下两种分配模式:

  • Even-split Redistribution
    • 每个算子都存储一个列表形式的状态集合,整个状态由所有的列表拼接而成
    • 但作业恢复或者重新分配时,整个状态按照算子的并行度均匀分配
  • UNIOn redistribution
    • 每个算子保存一个列表形式的状态集合,整个状态由所有的列表拼接而成
    • 但作业恢复或者重新分配时,每个算子都将获得所有的状态数据

ListCheckpointed接口:

ListCheckpointed接口是CheckpointedFunction接口的精简版,仅支持 even-split redistribution的list state

List snapshotState(long checkpointId, long timestamp) throws Exception;
void restoreState(List state) throws Exception;

snapshotState()需要返回一个将写入到checkpoint的对象列表, restoreState则需要处理恢复回来的对象列表。


参考文献:

Flink官方文档:

https://ci.apache.org/projects/flink/flink-docs-release-1.9/zh/dev/stream/state/checkpointing.html

Https://ci.apache.org/projects/flink/flink-docs-release-1.9/zh/ops/state/checkpoints.html

https://ci.apache.org/projects/flink/flink-docs-release-1.9/zh/dev/stream/state/state.html

您可能感兴趣的文档:

--结束END--

本文标题: 「Flink」Flink的状态管理与容错

本文链接: https://lsjlt.com/news/4027.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 「Flink」Flink的状态管理与容错
    在Flink中的每个函数和运算符都是有状态的。在处理过程中可以用状态来存储数据,这样可以利用状态来构建复杂操作。为了让状态容错,Flink需要设置checkpoint状态。Flink程序是通过checkpoint来保证容错,通过c...
    99+
    2019-08-30
    「Flink」Flink的状态管理与容错
  • Flink状态管理是怎么工作的
    Flink状态管理是通过内置的状态后端来实现的。Flink支持多种状态后端,如MemoryStateBackend、FsStateB...
    99+
    2024-04-02
  • flink中如何实现有状态stateful的计算
    小编给大家分享一下flink中如何实现有状态stateful的计算,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!import org.apache.fl...
    99+
    2023-06-02
  • flink state管理与恢复的方法是什么
    Flink提供了两种方法来管理和恢复状态:Checkpoint和Savepoint。 Checkpoint:Checkpoint...
    99+
    2024-03-07
    flink
  • vuex状态管理数据状态查询与更改的方法
    本篇内容介绍了“vuex状态管理数据状态查询与更改的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!状态管理数据状态查询与更改1.main...
    99+
    2023-06-30
  • React状态管理Redux原理与介绍
    目录一、Redux二、Redux的组成2.1 store2.2 state2.3 action2.4 reducer三、三大原则3.1 单一数据源3.2 State只读3.3 使用纯...
    99+
    2024-04-02
  • vuex状态管理数据状态查询与更改方式
    目录状态管理数据状态查询与更改1.main.js里引入状态管理2.store的创建vuex数据管理,组件数据一一对应1.组件A:我们拿到图片数据源2. vuex(首先要记得下载和安装...
    99+
    2024-04-02
  • Angular 中的状态管理
    在Angular中,可以使用各种库和模式来管理应用程序的状态。以下是一些常见的Angular状态管理解决方案:1. 内置的RxJS:...
    99+
    2023-09-21
    Angular
  • Vuex 状态管理的陷阱与规避之道
    Vuex 状态管理是一个强大的工具,可以帮助你管理 Vue.js 应用程序的状态。它可以让你在应用程序的不同组件之间共享数据,并可以在需要时轻松地更新数据。但是如果你不注意,很容易掉进一些陷阱。 1. 将 Vuex 用于所有数据 Vue...
    99+
    2024-02-21
    Vuex 状态管理 陷阱 规避
  • 前端的状态管理(上)
    目录1、什么是前端状态管理?2、Vuex3、Bus 总线4、web storage前言: 提到状态管理大家可能马上就想到:Vuex、Redux、Flux、Mobx等等方案。其实不然...
    99+
    2024-04-02
  • 前端的状态管理(下)
    目录1、Redux1.1、Store(图书馆管理员)1.2、State(书本)1.3、Action(借书单)1.4、store.dispatch (提交借书单)1.5、Reducer...
    99+
    2024-04-02
  • C#静态变量与云计算:状态管理探索
    在云计算环境下,静态变量的状态管理是一个重要的问题。静态变量在C#中是一种特殊的变量,它属于类而不是对象,因此它在整个应用程序中只有...
    99+
    2024-04-27
    C#
  • javascript Redux的状态管理详解
    所谓的状态管理,就是对应用程序中的数据进行管理。 理念:凡是数据流管理混乱的项目,几乎都上不了线。好的项目,必须有非常良好的数据流管理。 如何使用Redux?记住“3个3...
    99+
    2024-04-02
  • flutter 常见的状态管理器
    flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时,有效的状态管理是至关重要的,因为应用的不同部分可...
    99+
    2023-09-03
    flutter javascript 前端
  • Vuex 模块化与状态管理:完整指南
    ...
    99+
    2024-04-02
  • docker容器状态转换管理命令实例详解
    目录前言一、从镜像启动容器二、查看容器与日志三、进入容器内部操作系统四、停止容器暂停容器五、启动stopped状态的容器六、删除容器七、export与import八、commit九、...
    99+
    2024-04-02
  • Vue3状态管理的使用详解
    目录背景 Provide / Inject 抽离共享状态提供数据 注入数据 小结 reactive 抽离共享状态使用共享状态 小结 结语 背景 随着Vue3的逐步应用,对状态管理的...
    99+
    2024-04-02
  • ReactMobx状态管理工具的使用
    目录Mobx与redux的区别使用安装observable&&autorunaction使用装饰器写法runInAction(异步)Mobx与redux的区别 mob...
    99+
    2023-02-06
    React Mobx React Mobx状态管理 React状态管理
  • VUE 异步组件与状态管理:携手共进
    异步组件 异步组件是Vue.js中一个强大的功能,它允许开发者在初始页面加载时延迟加载组件。这对于优化大型应用程序的性能非常有用,因为它可以防止一次性加载所有组件,从而减少页面加载时间和提高初始渲染速度。 使用<keep-alive...
    99+
    2024-04-02
  • react18中react-redux状态管理的实现
    react的状态管理还是挺多的现在流行的有以下五种: RecoilMobXXStateReduxContext 今天我们来讲一下react众多状态管理之一的redux,虽然这个我不太...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作