动态表与状态快照|青训营笔记

161 阅读2分钟

动态表与状态快照|青训营笔记

这是我参与「第四届青训营 -大数据场」笔记创作活动的的第2篇笔记

一、动态表

1.1 DataStream 上的关系查询

image.png 因为高级关系数据库物化视图的特性,可以使用关系查询和SQL处理流

1.2 动态表与连续查询

动态表随时间变化的。可以像查询静态批处理表一样查询它们。查询动态表将生成一个 连续查询 。一个连续查询永远不会终止,结果会生成一个动态表。
它们间的关系
        流 -> 动态表 -> 连续查询 -> 新的动态表 -> 流

  1. 先将流转换为动态表
  2. 在动态表上进行连续查询,生成新的动态表
  3. 将生成的动态表转换为流

1.3 3种数据语义

  • at most once : 至多一次,表示一条消息不管后续处理成功与否只会被消费处理一次,存在数据丢失可能
  • at least once : 至少一次,表示一条数据最少被处理一次,可能会存在重复消费
  • exactly once : 精确一次,表示一条消息从其消费到后续的处理成功,只会发生一次

二、状态快照

状态快照指数据存储的某一时刻的状态记录

2.1 状态快照的制作

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

Chandy-Lamport算法制作全局快照

启动快照

假设进程pip_i发起快照

  1. pip_i记录自己的状态
  2. pip_i通过出边dijd_{ij}向其他进程pjp_j发送market消息
  3. pip_i通过入边djid_{ji}监听所有流向自己的信息

传播快照

  • 如果pjp_j还没有记录自己的状态——
  1. pjp_j记录自己的状态,并将dkjd_{kj}标记为空;
  2. pjp_j通过所有出边向其他进程发送marker消息;
  3. 通过所有入边开始监听所有流向自己的消息。
  • 如果pjp_j已经记录过自己的状态——
    记下入边上监听到的消息,直到收到marker消息为止。

终止快照

若所有进程都成功地:

  • 收到了marker消息;
  • 记录下了自己的状态;
  • 记录下了入边的状态(就是链上的消息)