Flink
问题
什么是 Flink?它和 Spark Streaming 有什么区别?
答案
Flink 核心特点
Flink 是一个流批一体的分布式计算引擎,以真正的流处理为核心。
| 特点 | 说明 |
|---|---|
| 真流处理 | 事件逐条处理,非微批 |
| Exactly-Once | 精确一次语义,数据不丢不重 |
| 有状态计算 | 内置状态管理 + Checkpoint |
| 事件时间 | 支持 Event Time,处理乱序数据 |
| 流批一体 | 同一套 SQL 处理流和批 |
Flink SQL 示例
-- 创建 Kafka 数据源
CREATE TABLE user_actions (
user_id BIGINT,
event_name STRING,
amount DECIMAL(18,2),
event_time TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'user_actions',
'format' = 'json'
);
-- 每 5 分钟窗口统计
SELECT
TUMBLE_START(event_time, INTERVAL '5' MINUTE) AS window_start,
COUNT(*) AS event_cnt,
SUM(amount) AS total_amount
FROM user_actions
GROUP BY TUMBLE(event_time, INTERVAL '5' MINUTE);
Flink vs Spark Streaming
| 对比 | Flink | Spark Streaming |
|---|---|---|
| 处理模型 | 真流处理 | 微批(默认 100ms~秒) |
| 延迟 | 毫秒级 | 秒级 |
| 状态管理 | 原生支持 | 需外部存储 |
| SQL 支持 | Flink SQL | Spark SQL |
| 适用 | 实时计算 | 准实时 |
窗口类型
| 窗口 | 说明 | 适用 |
|---|---|---|
| 滚动窗口 | 固定大小,不重叠 | 每 5 分钟汇总 |
| 滑动窗口 | 固定大小,可重叠 | 每 1 分钟计算过去 5 分钟的数据 |
| 会话窗口 | 按活动间隔分割 | 用户会话分析 |
数据分析师需要了解的
- Flink SQL 可以像写普通 SQL 一样处理实时数据
- 实时指标(实时 GMV、实时 UV)通常由 Flink 计算
- 流批一体趋势下,Flink SQL 正在统一离线和实时
常见面试问题
Q1: Flink 如何保证 Exactly-Once?
答案:
- Checkpoint 机制:定期保存状态快照
- Barrier 对齐:分布式快照算法(Chandy-Lamport)
- 两阶段提交:与 Kafka 等外部系统配合的端到端 Exactly-Once
Q2: Flink 的 Watermark 是什么?
答案:
- Watermark 是事件时间的一个水位线标记
- 告诉 Flink:早于这个时间的数据都已经到达
- 用于处理乱序数据,触发窗口计算
相关链接
- Spark - Spark 批处理
- 离线数仓 vs 实时数仓 - 流批一体架构