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

81 阅读2分钟

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

一、课程回顾

课前,老师先带领我们对上节课流式计算批式计算进行了回顾

批式计算

  1. 离线计算,非实时
  2. 静态数据集
  3. 小时/天等周期性计算

流式计算

  1. 实时计算,快速,低延迟
  2. 无限流、动态,无边界
  3. 7*24h持续运行
  4. 流批一体

历史发展:史前~2006 ==> Hadoop ==> Spark ==> Flink

二、数据流和动态表

1. 传统的SQL和流处理

SQL:

  1. 处理的表示有界的
  2. 执行查询可以访问完整的数据
  3. 批处理查询产生固定大小结果后终止

流处理:

  1. 流是一个无限元组序列
  2. 执行查询无法访问所有的数据
  3. 查询不断更新结果,永远不终止

2. 在流上定义表

动态表:与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。

3. 连续查询

连续查询

  1. 查询从不终止
  2. 查询结果会不断更新,产生一个新的动态表

image.png

4. 查询产生仅追加数据的动态表

image.png

5. 两者之间进行对比

虽然这两个示例查询看起来非常相似(都计算分组计数聚合),但他们在一个重要方面不同:

  1. 第一个查询更新先前输出的结果,即定义结果标的changelog流包含INSERT和UPDATE操作
  2. 第二个查询只附加到结果表,即结果表的changelog流只包含INSERT操作。

6.Retract消息的产生

image.png

7. 不同数据处理保证的语义

  1. At-most-once:出现故障的时候,啥也不做。数据的处理不保证任何语义,处理时延低;
  2. At-least-once:保证每条数据均至少被处理一次,一条数据可能存在重复消费。
  3. Exactly-once:最严格的处理语义,从输出结果来看,每条数据均被消费且消费一次,仿佛故障从未发生。

总结

今天的课程第一部分复习回顾了流批计算,引出了Exactly-Once语义,确保了数据处理的消费确定性。