实时数仓面试专题
概述
实时数仓面试高频覆盖:架构选型(Lambda/Kappa)、实时去重、回溯修正、数据一致性。本文按原理、指标实现、回溯修正、架构设计四类整理高频问答。
一、架构类
Q1:Lambda 与 Kappa 架构区别?
| 对比 | Lambda | Kappa |
|---|---|---|
| 计算层 | 批 + 流两套 | 只有流 |
| 代码 | 两份 | 一份 |
| 复杂度 | 高 | 低 |
| 准确性 | 批校验 | 依赖流 |
Kappa 用流重放替代批层
实时引擎成熟后更流行Q2:实时数仓为什么分层?
复用、清晰、可回溯:
ODS 原始 → DWD 明细 → DWS 汇总 → ADS 应用Q3:实时数仓与离线数仓差异?
| 维度 | 离线 | 实时 |
|---|---|---|
| 引擎 | Spark/Hive | Flink |
| 存储 | HDFS | Kafka/OLAP |
| 延迟 | 天/小时 | 秒/分钟 |
| 准确性 | 重算 | 流一致性 |
Q4:怎么保证实时离线一致性?
1. 统一指标口径
2. 明细落湖(同一份)
3. 实时离线对账
4. 偏差触发回溯二、实时去重
Q5:实时 UV 怎么算?
| 方案 | 说明 |
|---|---|
| COUNT DISTINCT | 精确、状态大 |
| HLL 近似 | 误差 1%、状态小 |
| 分桶去重 | 并行分散 |
选型:
UV 小 → 精确
UV 大 → HLL / 分桶Q6:实时去重为什么难?
去重需要记住所有 key:
状态大、恢复慢
权衡精确与资源Q7:精确去重方案?
MapState 记 user_id:
每 key 一条记录
状态 TTL 清理
分桶并行三、回溯与修正
Q8:实时数据回溯怎么做?
| 场景 | 方案 |
|---|---|
| 短回溯 | Kafka 重放 |
| 长回溯 | 湖 + 批重算 |
| 覆盖 | 幂等覆盖区间 |
Q9:迟到数据怎么处理?
| 手段 | 说明 |
|---|---|
| 水位线 | 容忍乱序 |
| allowedLateness | 窗口延迟 |
| 侧输出 | 迟到单独处理 |
| 补偿作业 | 定期修正 |
Q10:大窗口指标怎么算?
预聚合 + 定期校验:
实时给近似值
批/湖重算校正四、指标实现
Q11:实时留存怎么算?
维护每日活跃集合(状态):
T 日活跃 ∩ T+1 日活跃 / T 日活跃
状态按天管理,过期清理Q12:实时漏斗怎么算?
| 方式 | 说明 |
|---|---|
| 状态标记 | 记录用户最大步骤 |
| CEP | 事件序列匹配 |
| 多流 Join | 步骤关联 |
Q13:GMV 与 PV 实现?
求和/计数:
Flink 窗口聚合
GROUP BY TUMBLE(biz_time, ...)五、数据一致性
Q14:实时数仓怎么保证不丢不重?
端到端:
Source offset(checkpoint)
+ 状态快照
+ 幂等 Sink
= Exactly-OnceQ15:消息重复怎么办?
| 手段 | 说明 |
|---|---|
| 幂等写 | 唯一键 |
| 状态去重 | event_id |
| 对账 | 兜底修正 |
Q16:对账机制怎么设计?
总量 + 分维度对比:
实时 vs 离线
偏差超阈值告警
触发回溯修正六、场景设计题
Q17:电商实时大屏架构?
埋点/订单 → Kafka → Flink 聚合 → Doris → 大屏
分层:ODS → DWS → ADS
指标:GMV/UV/订单量
对账:离线校验Q18:高峰流量洪峰怎么处理?
1. 扩容 Flink 并行
2. Kafka 削峰缓冲
3. 降级(部分指标简化)
4. 背压保护
5. 事后回溯补数据Q19:指标突然异常如何排查?
1. 看采集(Kafka 流入正常?)
2. 看加工(Flink 延迟/失败?)
3. 看输出(Doris 写入?)
4. 看口径(变更?)
5. 对账定位Q20:实时数仓与湖仓一体结合?
CDC → Paimon/Iceberg(湖)
→ Flink 流读实时算
→ Spark 批读离线算
一套明细,流批统一七、高频易错点
| 易错点 | 正确理解 |
|---|---|
| 实时不丢 ≠ 不重 | 需幂等配合 |
| UV 用 HLL 即精确 | HLL 是近似 |
| 大窗口实时值精确 | 需定期校正 |
| 迟到=丢弃 | 可侧输出补偿 |
| 对账是可选 | 关键指标必须 |
| Kappa 免批 | 仍需历史重放能力 |
八、速答清单
| 高频题 | 一句话答案 |
|---|---|
| Lambda vs Kappa | 两套代码 vs 一套流 |
| UV 实时去重 | 状态/HLL/分桶 |
| 回溯怎么做 | Kafka 重放或湖批重算 |
| 迟到处理 | 水位线 + 延迟 + 补偿 |
| 一致性保证 | 快照 + 幂等 + 对账 |
| 留存实现 | 每日活跃集合关联 |
| 洪峰处理 | 扩容 + 削峰 + 降级 |