题记部分

一、什么是状态一致性

  有状态的流处理,内部每个算子任务都可以有自己的状态。对于流处理器内部来说,所谓的状态一致性,其实就是我们所说的计算结果要保证准确、一条数据也不应该丢失,也不应该重复计算,在遇到故障时可以恢复状态,恢复以后的重新计算,结果应该也是完全正确的。

二、状态一致性分类

(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] 状态一致性的更多相关文章

  1. Flink状态管理与状态一致性(长文)

    目录 一.前言 二.状态类型 2.1.Keyed State 2.2.Operator State 三.状态横向扩展 四.检查点机制 4.1.开启检查点 (checkpoint) 4.2.保存点机制 ...

  2. Flink的状态编程和容错机制(四)

    一.状态编程 Flink 内置的很多算子,数据源 source,数据存储 sink 都是有状态的,流中的数据都是 buffer records,会保存一定的元素或者元数据.例如 : ProcessWi ...

  3. Flink的状态与容错

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

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

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

  5. Flink之状态之checkpointing

    1.前言 在Flink中,函数和操作符都可以是有状态的.在处理每个消息或者元素时,有状态的函数都会储存信息,使得状态成为精密操作中关键的组成部分. 为了使状态能够容错,Flink会checkpoint ...

  6. Flink 应用的一致性保障

    应用一致性保障 在Flink中,会自动做检查点,用于故障时恢复一个应用.在恢复时,application的state信息可以根据最近完成的检查点进行重建,并继续运行.不过,仅将一个applicatio ...

  7. 9、flink的状态与容错

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

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

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

  9. Flink之状态之savepoint

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

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

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

随机推荐

  1. 【处理元组有关的题型的技巧】codeforces 1677 A. Tokitsukaze and Strange Inequality

    题意 第一行输入一个正整数 \(T(1 \leq T \leq 1000)\),代表共有 \(T\) 组测试用例,对于每组测试用例: 第一行输入一个正整数 \(n(4 \leq n \leq 5000 ...

  2. Redis应用—5.Redis相关解决方案

    大纲 1.数据库与缓存一致性方案 2.热key探测系统处理热key问题 3.缓存大value监控和切分处理方案 4.Redis内存不足强制回收监控告警方案 5.Redis集群缓存雪崩自动探测 + 限流 ...

  3. 11C++循环结构-for循环(1)

    一.for语句 引出问题: 当需要重复执行某一语句时,使用for语句.for语句最常用的格式为: for (循环变量赋初值:循环条件:循环变量增值) 语句: 注: "语句:"就是循 ...

  4. 在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析

    本文主要分析了在 K8s 中创建一个 Pod 并申请 GPU 资源,最终该 Pod 时怎么能够使用 GPU 的,具体的实现原理,以及 device plugin.nvidia-container-to ...

  5. 【C#】【FFmpeg】获取电脑可用音视频设备并输出到下拉列表框

    [重要]不要边看文本边操作,本文由错误纠正,先看完一遍再说. 要使用的FFmpeg命令 ffmpeg -list_devices true -f dshow -i dummy 会输出的信息 通过正则取 ...

  6. FLASK的基础

    1.导入flask from flask import Flask  #导入所需要的包 app = Flask(__name__)  #实例化对象 @app.route('/hello') #装饰器r ...

  7. Python 进阶:深入理解 import 机制与 importlib 的妙用

    大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ...

  8. Python 并发编程实战:优雅地使用 concurrent.futures

    在 Python 多线程编程中,concurrent.futures 模块提供了一个高层的接口来异步执行可调用对象.今天,我们将通过一个循序渐进的案例,深入了解如何使用这个强大的工具. 从一个模拟场景 ...

  9. Abp vNext 扩展属性

    扩展属性 我们发现abp的默认都会有一个ExtraProperties属性,那么他的作用是什么呢?当我们使用abp的时候,需要对其原有的表进行扩展或者添加我们想要的字段,又不想改源码,以最小的方式实现 ...

  10. 字节二面:你怎么理解信道是golang中的顶级公民

    1. 信道是golang中的顶级公民 goroutine结合信道channel是golang中实现并发编程的标配. 信道给出了一种不同于传统共享内存并发通信的新思路,以一种通道复制的思想解耦了并发编程 ...