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

72 阅读2分钟

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

数据流和动态表

流 => 表:提取字段,放入动态表

动态表是随时间变换的,但是可以像静态批处理表一样查询

连续查询

  • 查询不终止
  • 查询结果不断更新,产生一个新的动态表

状态一致性

Flink在保证exactly-once的同时,也保证了低延迟和高吞吐

一致性级别:

  • at-most-once: 不保证任何语义
  • at-least-once: 每条数据至少消费一次,但一条数据可能存在重复消费
  • exactly-once: 从输出结果看,每条数据均被消费且仅消费一次

CheckPoint

周期性的将状态数据进行持久化

Flink中的CheckPoint基于异步屏障快照算法,实现全局快照状态的一致

检查点分割线和普通数据记录类似,由算子处理,但并不参与计算,会触发与检查点相关的行为。当读取输入流的数据源(遇到检查点屏障时,将其在输入流中的位置保存到持久化存储中。如果输入流来自消息传输系统(Kafka),这个位置就是偏移量。

检查点操作失败,Flink可以丢弃该检查点并继续正常执行,因为之后的某一个检查点可能会成功。虽然恢复时间可能更长,但是对于状态的保证依旧很有力。只有在一系列连续的检查点操作失败之后,Flink才会抛出错误,因为这通常预示着发生了严重且持久的错误

端到端exactly-once

  • 内部 —— 利用checkpoint机制,把状态存盘,发生故障的时候可以恢复,保证内部的状态一致性
  • source —— kafka consumer作为source,可以将偏移量保存下来,如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性
  • sink —— kafka producer作为sink,采用两阶段提交 sink,需要实现一个 TwoPhaseCommitSinkFunction