这是我参与「第四届青训营 」笔记创作活动的的第6天
本节课主要讲述了流式计算的基本概念,watermark的含义,window的定义,以及相关优化问题,最后包含了两个案例分析。
1. 概述
| 特点 | 批式计算 | 流式计算 |
|---|---|---|
| 数据时效性 | 天级别 | 分钟级别 |
| 准确性 | 精准 | 精准和时效性取舍 |
| 计算模型 | Exactly-Once | At least once/exactly once |
| 资源模型 | 定时调度 | 长期持有 |
| 主要场景 | 离线天级别数据报表 | 实时数仓、实时营销、实时风控 |
(实时性越高,价值越大)
- 典型数仓架构:T+1(当天只能看到前一天的计算结果)
- 小时级批计算
- 处理时间:真正处理时所在机器的时间
- 事件时间:数据产生的时间 (理想是同时处理,实际上处理时间要比事件时间有所延迟)
- 实时计算:事件时间窗口
- 事件时间需要Watermark需要配合处理乱序
2. Watermark
-
定义:表示系统认为的当前真实的事件时间
-
如何产生?—— SQL/DataStream
-
传递:取上游subtask最小值
-
Flink UI 观察 Watermark
-
典型问题
(1)Per-subtask watermark:一个source subtask消费多个partition,partition之间数据读取可能会加剧乱序
(2)Per-partition watermark
(3)部分partition/subtask断流:Idle source(设置配置时间)
(4)迟到数据处理:Window聚合,默认丢弃;双流join;CEP,默认丢弃
3. Window
- 典型窗口:滚动,滑动,会话窗口
(1)滚动窗口:每一个key单独划分;每条数据只会属于一个窗口
(2)滑动窗口:每个key单独划分;每条数据可能属于多个窗口
(3)会话窗口:每个key单独划分;每条数据单独划分窗口
(4)迟到数据:丢弃
Allow lateness:设置一个允许迟到的时间(适用于DataStream/SQL)
SideOutput(侧输出流):打一个tag(适用于DataStream)
(5)增量 vs 全量计算:直接进行计算 vs 保留所有数据一起计算
(6)EMIT:中间结果输出多次
- 高级优化
(1)Mini-batch:优化解决频繁访问状态的问题
(2)倾斜优化 local-global
(3)Distinct计算状态复用:降低状态量
(4)Pane优化:降低滑动窗口的状态储存量
4. 案例分析
-
Flink SQL 计算抖音的日活曲线
通过两阶段聚合把数据打散
-
计算大数据任务的资源使用(离线计算)