这是我参与「第四届青训营 」笔记创作活动的的第7天
数据流和动态表
Flink所处理的对象是一个实时流,为了方便处理源源不断的实时流数据,利用动态表把SQL语言和实时数据相结合
随处可见的流数据
- 银行的计费服务
- GPS信号
- 物联网
- ...
传统SQL和流处理
| 特征 | SQL | 流处理 |
|---|---|---|
| 处理数据的有界性 | 处理的表是有界的 | 流是一个无限元组序列 |
| 处理数据的完整性 | 执行查询可以访问完整的数据 | 执行查询无法访问所以的数据 |
| 执行时间 | 批处理查询产生固定大小结果后终止 | 查询不断更新结果,永不终止 |
1、在传统的批式处理场景,数据是有界的,流式处理场景数据是无界的
2、由于数据有界,因此完整性及执行时间可以算出;无界数据这不会因为一次作业而终止运行,因此完整性和执行时间无法确定
概述-数据流和动态表转换
数据流→动态表→无线查询→动态表→数据流→...
在流上定义表
下图显示了单击事件流(左侧)如何转换为表(右侧)。当插入更多的单击流记录时,结果表将不断增长
数据流→动态表
动态表:与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。数据库表是INSERT、UPDATE和DELETE DML语句的stream的结果,通常称为changelog stream.
连续查询
- 查询从不终止
- 查询结果会不断更新,产生一个新的动态表
可能更新记录,新增记录
SQL语义:统计在某一网页内的用户点击次数
在任何时候,连续查询的结果在语义上与以批处理模式在输入表快照上执行的相同查询的结果相同。
任何时间都可以把动态表转化为静态表,把流式处理和批式处理结合
查询产生仅追加数据的动态表
SQL语义:统计某一个窗口连续不重叠的用户点击次数
两个连续查询的对比
虽然这两个示例查询看起来非常相似(都计算分组计数聚合),但它们在一个重要方面不同:
1.第一个查询更新先前输出的结果,即定义结果表的changelog流包含INSERT和UPDATE操作
2.第二个查询只附加到结果表,即结果表的changelog流只包含INSERT操作
Retract消息产生(回撤消息)
把动态表的结果输出到流
状态
需要存储每个用户的URL计数,以便能够增加该计数并在输入表接收新行时发送新结果
需要统计每个用户每次的总点击次数,先进行一定的储存,然后当用户再次点击时对数据进行更新
数据流和动态表转换回顾
1.数据流和动态表之间的转换;
2.在数据流的查询不会终止;
3.查询可能会有状态,用来不断更新查询的结果。
不同数据处理保证的语义
- At-most-once: 出现故障的时候,啥也不做。数据处理不保证任何语义,处理时延低;
对下游不保证,保证所有时间都在处理数据流;适用于:数据流大的时候
- At-least-once: 保证每条数据均至少被处理一次,一条数据可能存在重复消费。
保证数据不丢失
- Exactly-once: 最严格的处理语义,从输出结果来看,每条数据均被消费且仅消费一次,仿佛故障从未发生。