这是我参与「第四届青训营 」笔记创作活动的第3天
首先回顾上一次学习的动态表的概念:
动态表:与表示批处理数据的静态表不同,动态表是随着时间变化的。可以像查询静态批处理表一样查询他们。数据库表是INSERT、UPDATE、DELETE DML语句的stream的结果,通常称为changelog stream。
在之前学习了Flink中实现Exactly-once语义,以及Flink中的Retract机制。
在这次学习中主要是了解实时计算和批式计算的本质区别,以及实时计算所带来的新的机遇和挑战;其次对实时计算中的核心功能:Watermark机制和Window机制进行了解。
流式计算和批式计算的对比:
数据价值:实时性越高,数据价值越高。
| 特性 | 批式计算 | 流式计算 |
|---|---|---|
| 数据存储 | HDPS、Hive | Kafka、Pulsar |
| 数据时效性 | 天级别 | 分钟级别 |
| 准确性 | 精准 | 精准与时效性之间取舍 |
| 典型计算引擎 | Hive、Spark、Flink | Flink |
| 计算模型 | Exactly-once | At least Once/ Exacly Once |
| 资源模型 | 定时调度 | 长期持有 |
| 主要场景 | 离线天级别数据报表 | 实时数仓、实时营销、实时风控 |
批处理:
批处理模型典型的数仓架构为T+1架构,即数据计算时天级别的,当天只能看到前一天的计算结果。通常使用的计算引擎为Hive或Spark等。计算的时候,数据是完全ready的,输入和输出都是确定性的。
以此为基础要做到实时计算,也就是流处理。首先要处理时间窗口,数据在实时流动,进行实时计算,窗口结束则直接发送结果,不需要周期调度任务。
在实时计算中有两个概念需要进行区分:
-
处理时间:数据在流式计算系统中真正处理时所在及其的当前时间。
-
事件时间:数据产生的时间,比如客户啊、传感器、后端代码等上报数据时的时间。
Watermark
Watermark指的是表示系统认为的当前真实事件的时间。
产生Watermark主要有两种方式:
- SQL:
CREATE TABLE Order (
user BIGINT,
peoduct STRING,
order_time TIMESTAMP(3),
WATWEMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH ( . . . );
- DateStream:
WatermarkStrategy
.<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSecond(20))
.withTimestampAssigner((event, timestamp) -> event.f0);
Window
典型的Window:
- Tumble Window (滚动窗口):其中每个key单独划分,每条数据只属于一个窗口。
- Sliding Window (滑动窗口):其中每个key单独划分,每条数据可能属于多个窗口。
- Session Window (会话窗口):其中每个数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge。
其他Window:
- 全局 Window
- Count Window
- 累计窗口
- ......
总结
- 对流式计算的基本概念进行了学习,并且和批式计算进行了对比;
- 对Watermark的概念、如何生存、如何传递以及如何处理等问题进行了学习;
- 对三种window的定义、如何处理进行了学习。