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

84 阅读3分钟

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

课堂内容

数据流和动态表

大致过程是这样

image.png 就是说数据流要变成动态表,去进行一系列的查询工作continuous Quey,并且要保留他的状态到STATE,然后查询结果产生出一个新的动态表输出到数据流中。数据流和动态表是可以转化的。
具体过程如下: image.png

image.png 然后呢,下面这个是有窗口和没窗口的查询,有窗口就有UPDATEINSERT,没窗口就只要INSERT

image.png 对数据进行计数的过程有一个Retract的产生,就是一个更新的过程,把前面的数据删掉,然后加人新的数据。

image.png 对数据处理保证的语义有三种:At-most-once,At-least-once,Exactly-once

image.png

Exactly-once和Checkpoint

在Flink中的Exactly-once语义是通过JM发出checkpoint的指令实现的。 在这之前我们需要了解状态快照和恢复的概念,我们是用状态快照来恢复我们的数据,从而实现Exactly-once。

image.png source算子:记录当前消费的数据流的位点
sum_even算子:记录当前偶数累加的值
sum_odd算子:记录当前奇数累加的值

Chandy-Lamport算法:分布式的数据流奇偶数累加

image.png

Flink的快照制作过程\

首先是JM发出checkpoint指令,然后source短暂的停止运行,并保存自己的状态,然后向下游发送checkpiont barrier同时告诉JM自己的状态已经保存完毕。下游接收到checkpoint barrier就开始快照的执行,然后告诉JM自己的状态保存好了,当所有的算子都告诉JM状态制作完成后,整个checkpoint就结束即快照制作完成。同时我们需要知道一点整个过程解耦,上游完成之后就可以继续运行,不用等全部执行完。

image.png

image.png

image.png

image.png

Flink的端到端的Excatly-once

严格意义的端到端需要特殊的sink,所以我们有了一个两阶段提交协议,第一阶段预提交,commit指令先走一遍。第二阶段提交阶段,就是根据第一阶段如果全部yes,就实际commit执行然后做完了发个ask回来。然后第一阶段有no,就回滚rollback。

image.png

image.png

image.png 实际过程如下

image.png 预提交 image.png 提交阶段
总结

image.png

Flink案例讲解

当前方案 image.png

Flink方案 image.png

课后学习

  1. 流式处理中算子为什么会有状态?
  1. 数据流和动态表之间是如何进行转换的?
  1. Flink 作业为什么需要考虑故障恢复?
  1. Flink 故障恢复前为什么需要Checkpoint?
  1. 为什么不能保留任意时刻的状态作为故障恢复的时间点?
  1. Flink Checkpoint 对作业性能的影响有多大?
  1. 两阶段提交协议对性能影响有多大?
  1. 写入下游如果不支持事务读写,能做到 Exactly-Once 语义么