Flink - [08] 状态一致性
题记部分
一、什么是状态一致性
有状态的流处理,内部每个算子任务都可以有自己的状态。对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确、一条数据也不应该丢失,也不应该重复计算,在遇到故障时可以恢复状态,恢复以后的重新计算,结果应该也是完全正确的。
二、状态一致性分类
(1)AT-MOST-ONCE(最多一次)
当任务故障时,最简单的做法是什么都不干,既不恢复丢失的状态,也不重播丢失的数据。At-most-once 语义的含义是最多处理一次事件。
(2)AT-LEAST-ONCE(至少一次)
在大多数的真实应用场景,我们希望不丢失事件。这种类型的保障称为at-least-once,意思是所有的事件都得到了处理,而一些事件还可能被处理多次。
(3)EXACTLY-ONCE(精确一次)
恰好处理一次是最严格的保证,也是最难实现的。恰好处理一次语义不仅仅意味着没有事件发生,还意味着针对每一个数据,内部状态仅仅更新一次。
三、一致性检查点
Flink使用了一种轻量级快照机制 —— 检查点(checkpoint)来保证exactly-once语义,有状态流应用的一致检查点,其实就是:所有任务的状态,在某个时间点的一份拷贝(一份快照)。而这个时间点,应该是所有任务都恰好处理完一个相同的输入数据的时候。应用状态的一致检查点,是Flink故障恢复机制的核心。

四、端到端状态一致性
目前我们看到的一致性保证都是由流处理器实现的,也就是说都是在Flink流处理器内部保证的;而在真实应用中,流处理应用除了流处理器以外还包含了数据源(例如Kafka)和输出到持久化系统。端到端的一致性保证,意味着结果的正确性贯穿了整个流处理应用的始终;每一个组件都保证了它自己的一致性。整个端到端的一致性级别取决于所有组件中一致性最弱的组件。
五、端到端 exactly-once
(1)内部保证 —— checkpoint
(2)source端 —— 可重设数据的读取位置
(3)sink端 —— 从故障恢复时,数据不会重复写入外部系统
① 幂等写入
② 事务写入
六、幂等写入
所谓幂等操作,是说一个操作,可以重复执行很多次,但只导致一次结果更改,也就是说,后面再重复执行就不起作用了。

七、事务写入
(1)事务(Transaction)
① 应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤销
② 具有原子性:一个事务中的一系列的操作要么全部成功,要么一个都不做
(2)实现思想:构建的事务对应着checkpoint,等到checkpoint真正完成的时候,才把所有对应的结果写入sink系统中。
(3)实现方式:
① 预写日志
② 两阶段提交
八、预写日志
把结果数据先当成状态保存,然后在收到checkpoint完成的通知时,一次性写入sink系统。简单易于实现,由于数据提前在状态后端中做了缓存,所以无论什么sink系统,都能用这种方式一批搞定。DatasStream API提供了一个模板类:GenericWriteAheadSink,来实现这种事务性sink。
九、两阶段提交
Two-Phase-Commit,2PC
对于每个checkpoint,sink任务会启动一个事务,并将接下来所有接收的数据添加到事务里。然后将这些数据写入外部sink系统,但不提交它们 —— 这时只是“预提交”。当它收到checkpoint完成的通知时,它才正式提交事务,实现结果的真正写入。这种方式真正实现了exactly-once,它需要一个提供事务支持的外部sink系统。Flink提供了TwoPhaseCommitSinkFunction接口。
2PC对外部sink系统的要求?
(1)外部sink系统必须提供事务支持,或者sink任务必须能够模拟外部系统上的事务。
(2)在checkpoint的间隔期间里,必须能够开启一个事务并接受数据写入。
(3)在收到checkpoint完成的通知之前,事务必须是“等待提交”的状态。在故障恢复的情况下
十、不同Source和Sink的一致性保证
十一、Flink + Kafka端到端状态一致性保证
十二、Exactly-once 两阶段提交
— 业精于勤荒于嬉,行成于思毁于随 —
Flink - [08] 状态一致性的更多相关文章
- Flink状态管理与状态一致性(长文)
目录 一.前言 二.状态类型 2.1.Keyed State 2.2.Operator State 三.状态横向扩展 四.检查点机制 4.1.开启检查点 (checkpoint) 4.2.保存点机制 ...
- Flink的状态编程和容错机制(四)
一.状态编程 Flink 内置的很多算子,数据源 source,数据存储 sink 都是有状态的,流中的数据都是 buffer records,会保存一定的元素或者元数据.例如 : ProcessWi ...
- 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之状态之checkpointing
1.前言 在Flink中,函数和操作符都可以是有状态的.在处理每个消息或者元素时,有状态的函数都会储存信息,使得状态成为精密操作中关键的组成部分. 为了使状态能够容错,Flink会checkpoint ...
- Flink 应用的一致性保障
应用一致性保障 在Flink中,会自动做检查点,用于故障时恢复一个应用.在恢复时,application的state信息可以根据最近完成的检查点进行重建,并继续运行.不过,仅将一个applicatio ...
- 9、flink的状态与容错
1.理解State(状态) 1.1.State 对象的状态 Flink中的状态:一般指一个具体的task/operator某时刻在内存中的状态(例如某属性的值) 注意:State和Checkpoint ...
- flink 有状态udf 引起血案一
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/rlnLo2pNEfx9c/article/details/83422587 场景 近期在做一个画像的 ...
- Flink之状态之savepoint
1.总览 savepoints是外部存储的自包含的checkpoints,可以用来stop and resume,或者程序升级.savepoints利用checkpointing机制来创建流式作业的状 ...
- Flink之状态之状态存储 state backends
流计算中可能有各种方式来保存状态: 窗口操作 使用 了KV操作的函数 继承了CheckpointedFunction的函数 当开始做checkpointing的时候,状态会被持久化到checkpoin ...
随机推荐
- 【处理元组有关的题型的技巧】codeforces 1677 A. Tokitsukaze and Strange Inequality
题意 第一行输入一个正整数 \(T(1 \leq T \leq 1000)\),代表共有 \(T\) 组测试用例,对于每组测试用例: 第一行输入一个正整数 \(n(4 \leq n \leq 5000 ...
- Redis应用—5.Redis相关解决方案
大纲 1.数据库与缓存一致性方案 2.热key探测系统处理热key问题 3.缓存大value监控和切分处理方案 4.Redis内存不足强制回收监控告警方案 5.Redis集群缓存雪崩自动探测 + 限流 ...
- 11C++循环结构-for循环(1)
一.for语句 引出问题: 当需要重复执行某一语句时,使用for语句.for语句最常用的格式为: for (循环变量赋初值:循环条件:循环变量增值) 语句: 注: "语句:"就是循 ...
- 在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
本文主要分析了在 K8s 中创建一个 Pod 并申请 GPU 资源,最终该 Pod 时怎么能够使用 GPU 的,具体的实现原理,以及 device plugin.nvidia-container-to ...
- 【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框
[重要]不要边看文本边操作,本文由错误纠正,先看完一遍再说. 要使用的FFmpeg命令 ffmpeg -list_devices true -f dshow -i dummy 会输出的信息 通过正则取 ...
- FLASK的基础
1.导入flask from flask import Flask #导入所需要的包 app = Flask(__name__) #实例化对象 @app.route('/hello') #装饰器r ...
- Python 进阶:深入理解 import 机制与 importlib 的妙用
大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ...
- Python 并发编程实战:优雅地使用 concurrent.futures
在 Python 多线程编程中,concurrent.futures 模块提供了一个高层的接口来异步执行可调用对象.今天,我们将通过一个循序渐进的案例,深入了解如何使用这个强大的工具. 从一个模拟场景 ...
- Abp vNext 扩展属性
扩展属性 我们发现abp的默认都会有一个ExtraProperties属性,那么他的作用是什么呢?当我们使用abp的时候,需要对其原有的表进行扩展或者添加我们想要的字段,又不想改源码,以最小的方式实现 ...
- 字节二面:你怎么理解信道是golang中的顶级公民
1. 信道是golang中的顶级公民 goroutine结合信道channel是golang中实现并发编程的标配. 信道给出了一种不同于传统共享内存并发通信的新思路,以一种通道复制的思想解耦了并发编程 ...