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

35 阅读2分钟

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

动态表

表示批处理数据使用静态表动态表则用来表示流数据,动态表是随着时间变化的,可以像查询静态表一样查询。

动态表的查询方式:

  • 连续查询:查询结果不断更新,每次更新产生新的动态表,任何一个时刻的动态表都可以看作是一个静态表。
  • 仅追加数据的动态表:新产生的结果以append的形式添加到动态表后面,只包含插入操作。

Exactly-once语义是最严格的处理语义,从输出结果来看,每条数据均被消费且仅消费一次,如果出现故障,仿佛故障从未发生。

Checkpoint

状态恢复的时间点需要等待所有处理逻辑消费完成,source保留状态及之前的数据。因此快照制作时需要暂停输入,并等待当前已输入的数据消费完成,才能复制自己的状态并保存到可靠存储中。

Flink异步快照的核心就是Checkpoint机制,用标记信号Barrier将数据流切分,上游的Barrier传递到下游,下游才会触发Checkpoint,即Barrier对齐。Flink通过Barrier对齐实现Exactly-once。

两段提交协议-2PC

分布式系统中,为了保证执行和回滚的操作同步执行,需要由一个节点来统筹集群的执行逻辑,负责统筹的节点称为协作者,其他节点称为参与者

两段提交分为预提交阶段和提交阶段:

  • 预提交阶段:协作者向所有参与者发送commit,协作者收到消息后执行事务但不提交,如果执行成功给协作者返回vote yes,如果执行失败返回vote no。
  • 提交阶段:
    • 协作者若收到所有的vote yes,则向所有参与者发送commit,参与者收到消息后释放资源,结束事务,返回ack,协作者收到全部ack后标识事务已完成
    • 协作者若有收到vote no或等待超时,则向所有参与者发送rollback,参与者收到消息后回滚事务操作,释放资源,返回ack,协作者收到全部ack后标识事务已回滚

Flink利用两段提交协议保证端到端的Exactly-once语义,JM负责协作者,所有task均为参与者。