Exactly Once 语义在 Flink 中的实现 | 青训营笔记

66 阅读2分钟

Exactly Once 语义在 Flink 中的实现 | 青训营笔记

这是我参与「第四届青训营 」笔记创作活动的的第4天

课程中可能用到的专有名词释义 :

  • Stream: 数据流

  • Dynamic Table: 动态表

  • Continuous Queries: 连续查询

  • Append-only Stream: Append-only 流(只有 INSERT 消息)

  • Retract Stream: Retract 流(同时包含 INSERT 消息和 DELETE 消息)

  • Upsert Stream:: Upsert 流(同时包含 UPSERT 消息和 DELETE 消息)

  • Changelog: 包含 INSERT/UPDATE/DELETE 等的数据流

  • State: 计算处理逻辑的状态


  • Application Consistency Guarantees: 作业一致性保证

  • At-most-once:每条数据消费至多一次

  • At-least-once:每条数据消费至少一次

  • Exactly-once: 每条数据都被消费且仅被消费一次

  • Checkpoint: Flink 实现各个计算逻辑状态快照算法,也可指一次状态快照

  • Checkpoint barrier: 用于标识状态快照的制作,也将数据划分成不同的消费区间

  • Checkpoint Alignment: 等待多个上游的Checkpoint barrier到达的现象

  • JobManager: 负责协调和管理 Checkpoint


  • Two-phase commit protocol: 两阶段提交协议

  • Transaction: 一系列保证原子性操作的集合,即操作同时执行或者都不执行

  • Kafka: 消息中间件

  • State Backend: 用于管理和保存状态到远端可靠存储

  • Deduplication:去重,在 state 保留的时间内对重复消息进行去重

  • Aggregation:聚合操作,比如求和、求最大值等

一、数据流和动态表:

1.1 传统的SQL与流式处理对比:

image.png

1.2 数据流与动态表转换:

image.png

  • 动态表     随时间不断变化的表,在任意时刻,可以像查询静态批处理表一样查询它们。

  • 动态表到实时流的转换

    • Append-only Stream: Append-only 流(只有 INSERT 消息)
    • Retract Stream: Retract 流(同时包含 INSERT 消息和 DELETE 消息)

  • Upsert Stream:: Upsert 流(同时包含 UPSERT 消息和 DELETE 消息)

  • 实时流的查询特点:

    • 查询从不终止
    • 查询结果会不断更新,并且会产生一个新的动态表
    • 结果的动态表也可转换成输出的实时流
  • 连续查询:

在任何时候,连续查询的结果在语义上与批处理模式在输入表快照上执行的相同查询的结果相同。

image.png

1.3 查询产生的仅追加的动态表:

image.png

二、状态快照与恢复

image.png

  • 状态恢复的时间点:需要等待所有处理逻辑消费完成source保留状态及之前的数据。

  • 一个简单快照的制作算法:

    • 1.暂停处理输入的数据;
    • 2.等待后续所有处理算子消费当前已经输入的数据;
    • 3.待2处理完后,作业所有算子复制自己的状态并保存到远端可靠存储;
    • 4.恢复对输入数据的处理。