数据核心专题面试专项
适用对象:数据开发、数仓、实时计算、数据平台、湖仓一体、分析型后端、数据治理相关面试。
阅读方式:先背“通用答题框架”,再刷“专题高频题”,最后用“对比选型”和“场景设计”做压轴训练。
版本参考:本文按 2025-08 的主流技术线整理;涉及版本号的内容以官方最新稳定版/最新文档页为准,补丁级差异以发行说明为准。
0. 通用答题框架
面试里遇到数据题,最稳的答法不是“背定义”,而是先给结论,再讲为什么,再落到方案和代价。
- 先给一句话结论:这个问题的核心矛盾是什么,推荐什么方案。
- 再讲原理:数据怎么流、状态怎么存、语义怎么保、性能怎么提。
- 再讲工程化:分层、幂等、监控、回滚、容灾、成本控制。
- 再讲取舍:为什么不用别的方案,边界在哪里,坑在哪里。
- 最后补一句面试加分点:口径统一、可回放、可恢复、可治理。
高频答题模板
- 基础版:定义 + 场景 + 一个常见实现。
- 进阶版:再补流程、组件协同、性能和一致性。
- 加分版:再补边界条件、降级策略、监控指标和故障恢复。
1. 版本与趋势速查
这部分不是为了背版本号本身,而是为了知道“行业现在主流怎么选”。
| 组件 | 当前主流版本线 | 面试关键词 |
|---|---|---|
| Spark | 4.1.1 | 批处理、SQL、流批融合、Declarative Pipelines、实时模式 |
| Flink | 2.2.0 | 真流处理、状态、Exactly-Once、Savepoint、SQL/Table |
| Hadoop | 3.5.0 | HDFS、YARN、离线底座、存算分离前的传统中枢 |
| Kafka | 4.2.0 | 日志队列、削峰填谷、消费组、事务、幂等、流处理源头 |
| Iceberg | 1.10.1 | 开放表格式、隐藏分区、Schema Evolution、多引擎 |
| Paimon | 1.4.1 | 实时湖仓、主键表、Changelog、CDC、Flink first |
| Hudi | 1.1.1 | Upsert、MOR/COW、Table Services、增量拉取 |
| ClickHouse | 26.4 | 高性能 OLAP、列存、聚合、明细查询、实时分析 |
| HBase | 2.6.5 | 宽表、随机读写、RowKey 设计、热点规避 |
| Cassandra | 5.0.8 | AP、线性扩展、高写入、去中心化 |
| Solr | 10.0.0 | 文本检索、相关性、倒排索引、搜索场景 |
| MongoDB | 8.2 | 文档模型、灵活 Schema、事务、聚合管道 |
| Elasticsearch | 9.4.1 | 搜索 + 聚合 + 可观测,检索型分析 |
版本趋势怎么说
- 湖仓一体的主流方向不是“单一引擎统治”,而是“开放表格式 + 多引擎计算 + 对象存储底座”。
- 实时数仓的主流方向不是“纯 Lambda 双链路”,而是“统一口径 + 单一事实层 + 流批协同”。
- 事务和一致性问题的主流方向不是“强行全局强一致”,而是“局部强一致 + 全链路幂等 + 可重放 + 可补偿”。
2. 数据仓库专题(★★★★★)
2.1 数仓分层设计:ODS -> DWD -> DWS -> ADS
高频指数:★★★★★。这是数据仓库面试的地基题,面试官最爱追问“为什么要分层”和“每层负责什么”。
一句话结论: 分层的本质是把“采集、清洗、建模、聚合、应用”解耦,让数据口径统一、复用能力更强、链路更稳定、变更影响更小。
1 | flowchart LR |
基础版:
- ODS 负责原始数据落地,尽量保持原貌,便于追溯和重放。
- DWD 负责清洗、去重、统一编码、统一主键、统一时间语义。
- DWS 负责按主题沉淀公共指标和宽表,减少重复加工。
- ADS 负责直接面向业务场景输出结果,例如报表、接口、画像、风控特征。
进阶版:
- 分层不是教条,核心是“谁负责数据质量,谁负责公共复用,谁负责最后消费”。
- DWD 要尽量做成“可复用的明细事实层”,避免把业务逻辑写死在报表里。
- DWS 适合做高频公共指标、复合维度宽表、主题域汇总,不适合塞太多一次性逻辑。
- ADS 应尽量轻,重点是输出快、口径稳、变更小。
加分版:
- 可以把 ODS 再细分为贴源层、标准原始层、历史归档层,分别承担回放、合规、追踪。
- 可以把 DWD 做成事实表 + 维表快照 + 统一字典层,减少下游重复 join。
- 可以将 DWS 与语义层绑定,让指标定义和计算逻辑可版本化。
易错点:
- ODS 不是垃圾堆,不是所有脏数据都堆进去后再说。
- DWD 不是“大杂烩清洗层”,不能把所有业务规则都塞进来。
- DWS 不是“什么都汇总一下”,它要围绕主题域和公共复用来设计。
2.2 建模方法:范式建模 vs 维度建模
一句话结论: 范式建模更强调消除冗余和更新一致性,维度建模更强调分析易用和查询性能;数仓里常见做法是“底层范式化、服务层维度化”。
基础版:
- 范式建模适合 OLTP 或需要强更新一致性的场景。
- 维度建模适合分析型场景,典型是事实表 + 维度表。
- 事实表表达“发生了什么”,维度表表达“围绕什么看”。
进阶版:
- 维度建模里要先识别业务过程,再定义粒度,再确定事实和维度。
- 粒度是最重要的建模起点,粒度不清,后面所有指标都会歪。
- 常见事实表包括事务事实表、周期快照事实表、累积快照事实表。
加分版:
- 数仓常用“核心层偏范式、应用层偏维度”的混合思路。
- 对实时分析场景,可以把维度快照、主键表、宽表和指标表组合起来,减少复杂 join。
- 设计时要考虑变更成本:维表缓慢变化、事实口径调整、历史重算、血缘追踪。
易错点:
- 维度建模不是只做星型模型,雪花模型、混合模型也有用武之地。
- 事实表不是越宽越好,宽表会增加写入成本和维护成本。
2.3 缓慢变化维(SCD)
一句话结论: SCD 的本质是处理“维度属性变了,历史怎么算”的问题,核心是保留业务所需的历史一致性。
基础版:
- SCD1:直接覆盖,不保留历史,适合错误修正或不关心历史的字段。
- SCD2:新增版本行,保留历史,最常见于需要追溯的业务维度。
- SCD3:保留有限历史字段,例如当前值 + 上一个值。
进阶版:
- 处理 SCD2 时通常会有生效时间、失效时间、当前标记、版本号。
- 维度变更时要明确是“覆盖、追加、还是局部版本化”。
- 大部分分析场景最需要的是“按事实发生时的维度快照”。
加分版:
- 维度慢变不一定非要全量重写,可以通过增量变更日志、CDC、变更维表来实现。
- 对实时数仓,SCD2 要特别关注乱序、重复和迟到数据。
易错点:
- 不要把 SCD2 简化成“加个时间字段就行”,版本切换逻辑才是关键。
- 不要在事实表里直接硬编码维度属性,否则后期变更会很痛。
2.4 数据生命周期管理
基础版:
- 生命周期管理解决的是“数据存多久、放哪、何时归档、何时删除”。
- 常见分级是热数据、温数据、冷数据、归档数据。
进阶版:
- 热数据通常放在低延迟存储或查询引擎,服务实时查询和近线分析。
- 冷数据可以迁移到对象存储或低成本存储,保留审计和回放能力。
- 生命周期策略要和合规要求、业务回溯期限、成本预算绑定。
加分版:
- 生命周期不是单纯 TTL,通常还要配合分区裁剪、冷热分层、自动压缩、自动清理。
- 重要表要保留恢复窗口,避免误删后完全无法找回。
2.5 数据质量保障
核心目标: 让数据“可用、可信、可追踪、可恢复”。
基础版:
- 质量维度常见包括完整性、准确性、一致性、唯一性、及时性、合法性。
- 常见规则有非空、唯一、范围、枚举、关联关系、数量阈值、同比环比阈值。
进阶版:
- 质量体系要分层:采集校验、ETL 校验、入仓校验、出仓校验、消费校验。
- 质量告警要能区分“数据波动”与“链路故障”,避免噪音过多。
- 质量问题要能定位到字段、批次、分区、血缘和责任人。
加分版:
- 大型平台应把质量规则做成配置化、版本化、可回放。
- 最有效的质量治理往往不是“事后报警”,而是“事前约束 + 过程校验 + 末端审计”。
易错点:
- 只做 SQL 校验不够,采集语义、时间语义、主键语义同样重要。
- 质量规则不能太多太乱,否则告警会失真。
2.6 元数据管理
核心目标: 解决“这张表是谁生成的、从哪来、被谁用、出了问题找谁”的问题。
基础版:
- 元数据分技术元数据和业务元数据。
- 技术元数据包括库表结构、分区、字段类型、任务依赖、作业参数。
- 业务元数据包括指标口径、主题定义、责任人、使用场景。
进阶版:
- 元数据系统最好能和血缘、权限、质量、资产目录联动。
- 有了血缘,才能快速定位某个指标受哪些上游变更影响。
- 有了资产目录,才能让数据像“产品”一样被搜索和使用。
加分版:
- 面试里可以强调“指标定义可版本化,血缘可追踪,口径可回放”。
- 元数据系统不仅是管理工具,也是治理中台的神经系统。
2.7 离线数仓 vs 实时数仓
一句话结论: 离线数仓重吞吐和全量分析,实时数仓重低延迟和增量更新;真正难的是两者口径统一。
基础版:
- 离线数仓适合 T+1、T+0.5、日级报表、历史分析。
- 实时数仓适合分钟级、秒级看板、风控、监控、在线特征。
进阶版:
- 离线链路一般以批处理为主,重算能力强,成本相对低。
- 实时链路一般以流处理为主,强调低延迟、状态一致性、持续更新。
- 两者最终最好共享统一指标定义、统一维表、统一主题模型。
加分版:
- 现代架构里常见做法是“实时负责新鲜度,离线负责准确性和回补”。
- 口径统一的关键不是“两个链路算出一样的 SQL”,而是“同一套语义层和维表版本”。
2.8 湖仓一体设计
一句话结论: 湖仓一体的本质是把数据湖的低成本、开放性,和数仓的治理、性能、语义统一起来。
1 | flowchart TB |
基础版:
- 湖仓一体要同时满足开放格式、统一治理、跨引擎读写、历史回溯。
- 核心不是“把湖变成仓”,而是“让湖具备仓的能力”。
进阶版:
- Iceberg 更像开放标准表格式,重点在多引擎一致访问和隐藏分区。
- Paimon 更偏实时湖仓和主键表场景,适合 CDC、增量、流式写入。
- Hudi 更强调 upsert、增量拉取和表服务能力,适合有历史沉淀的实时更新场景。
加分版:
- 设计湖仓平台时,要把 Catalog、Schema 演进、权限、质量、生命周期一起考虑。
- 现代方案通常不会只押一个引擎,而是“存储层统一、计算层多引擎、服务层按场景分发”。
易错点:
- 湖仓一体不是“把表放到对象存储上就完事了”。
- 如果没有治理层,开放格式只会把混乱放大。
3. 数据一致性与语义保障专题(★★★★★)
3.1 消息语义:At-Most-Once / At-Least-Once / Exactly-Once
一句话结论: 消息语义本质是“会不会丢、会不会重、能不能逻辑只生效一次”。
基础版:
- At-Most-Once:最多处理一次,可能丢,不会重复。
- At-Least-Once:至少处理一次,不会丢,可能重复。
- Exactly-Once:逻辑上只生效一次,通常要靠状态、事务或幂等共同实现。
进阶版:
- 工程里常见的是“源头至少一次 + 末端幂等/事务 + 状态一致性”。
- 真正的端到端 Exactly-Once 比单点 Exactly-Once 更难,因为源、流、存储、下游 API 都可能重复。
加分版:
- 不要把“组件内部 Exactly-Once”误认为“整个系统 Exactly-Once”。
- 面试里可以直接说:业务上最稳的方案通常是“允许重复、但不允许错账;允许延迟、但不允许丢失”。
3.2 幂等设计
基础版:
- 幂等就是同一请求重复执行多次,结果和执行一次一致。
- 常见手段有业务唯一键、请求 ID、版本号、状态机、去重表。
进阶版:
- 写入幂等常见于 upsert、覆盖写、唯一索引、插入前查重。
- 消息幂等要结合消费位点、业务主键、事件版本、窗口状态来设计。
加分版:
- 只靠“先查再写”不安全,因为并发下会有竞态,必须借助原子约束或事务。
- 高并发场景里,幂等通常要和“乐观锁、唯一约束、版本控制、幂等表 TTL”一起用。
3.3 事务写入与两阶段提交
1 | sequenceDiagram |
基础版:
- 两阶段提交分 prepare 和 commit。
- prepare 阶段先把数据写成可提交状态,commit 阶段再正式生效。
进阶版:
- 2PC 的好处是保证跨阶段一致性,坏处是对延迟和故障恢复有要求。
- 流处理里常用“checkpoint + 预提交 + 事务提交”实现端到端一致性。
加分版:
- 2PC 不是银弹,锁持有时间长、协调器故障、长事务都会影响吞吐。
- 工程上要尽量让事务短、提交快、失败可重试、结果可幂等。
3.4 跨系统一致性
核心问题: 一个业务动作同时影响数据库、消息队列、搜索引擎、缓存和数仓时,怎么避免双写不一致。
基础版:
- 常见策略有本地事务 + 事务消息、Outbox、CDC、补偿任务。
- 先落主库,再通过 binlog/CDC 推送到下游,通常比多点同时写更稳。
进阶版:
- 如果一定要双写,必须有幂等键和补偿逻辑。
- 对最终一致的链路,要设计“可重放、可修复、可对账”。
加分版:
- 面试里可以区分“强一致”与“业务一致”。
- 大部分数据平台追求的是业务一致,而不是分布式数据库那种全局强一致。
3.5 数据去重方案
基础版:
- 去重常见于按业务主键、事件 ID、订单号、用户行为 ID 去重。
- 方式包括
DISTINCT、窗口函数、状态去重、唯一键、去重表、Bloom Filter。
进阶版:
- 批处理去重适合全量或大窗口,实时去重适合状态 + TTL。
- 迟到数据会让“窗口内去重”变复杂,需要 watermark 和允许迟到策略。
加分版:
- 真正稳的方案通常不是单点去重,而是“源头唯一键 + 中间状态去重 + 末端幂等”。
- 不要把去重和去重后的更新语义混为一谈,尤其是在 upsert 场景中。
易错点:
- 仅靠
SELECT DISTINCT不能解决乱序、迟到和重复消费。 - 仅靠缓存去重不能承受重启、扩容和状态恢复。
4. 数据倾斜专题(★★★★★)
4.1 倾斜为什么会出现
一句话结论: 倾斜不是“某个组件坏了”,而是数据分布、Key 设计、算子策略和业务热点叠加的结果。
常见原因包括:
- 热点 Key:某几个用户、商品、地区、设备过于集中。
- join 倾斜:维表/事实表某些 Key 命中次数异常高。
- 聚合倾斜:group by key 分布极不均匀。
- 时间倾斜:某个时间窗口流量暴涨,某些分区爆满。
- 文件/分区倾斜:分区设计不合理,导致少数分区超大。
- 热点写入:RowKey 单调递增或分片键设计差。
4.2 怎么识别倾斜
基础版:
- 看任务耗时是否长尾明显。
- 看单个 task 的 shuffle read/write 是否远高于平均值。
进阶版:
- Spark 看某些 task runtime、spill、shuffle bytes 是否异常。
- Flink 看 subtask busy/backpressure、checkpoint 延迟、state size 是否偏斜。
- Hive 看 reducer 数量是否少而重,或者个别 reducer 特别慢。
加分版:
- 识别倾斜时不能只看 CPU,要同时看 IO、网络、内存、状态和磁盘 spill。
- 如果一个任务只有一个分区慢,通常不是“机器慢”,而是“数据不均”。
4.3 各组件中的不同表现
Hive:
- 常见表现是某几个 reducer 特别慢,整个 SQL 被尾部拖住。
- 解决通常是 map join、skew join、分桶、预聚合、开启 skew 处理。
Spark:
- 常见表现是少数 partition 特别大,导致长尾 task。
- 可用 AQE、skew join、broadcast join、repartition by range、salting。
Flink:
- 常见表现是某几个 key group 的状态和吞吐过高。
- 需要从 key 设计、算子并行度、局部聚合、状态拆分、异步下沉解决。
HBase:
- 常见表现是少数 region 热点,写入和读取都打爆同一台 RegionServer。
- 关键在 RowKey 设计、预分裂、盐值、反转时间戳、负载均衡。
ClickHouse:
- 常见表现是某些 shard、某些分区、某些聚合阶段特别慢。
- 常用策略是更合理的 shard key、两阶段聚合、物化视图预聚合、避免超大单分区。
4.4 通用解决方案
基础版:
- 加盐:给热点 Key 扩散成多个子 Key。
- 预聚合:先在局部做一次聚合,再做全局聚合。
- 广播:小表 broadcast,避免大 shuffle join。
进阶版:
- 拆分热点 Key:把一个热点 Key 拆成多个逻辑子桶。
- 两阶段处理:先分散计算,再汇总结果。
- 分区重设计:按更均匀的维度切分数据。
加分版:
- 不要只想着“调参数”,更重要的是把业务 Key 设计好。
- 最好的倾斜治理是“从模型上避免热点”,而不是“事后补救”。
4.5 组件专属方案
- Hive:map join、skew join、bucket map join、开启倾斜优化。
- Spark:AQE、skew join、broadcast join、salting、repartitionByRange。
- Flink:key 设计优化、局部聚合、热 key 拆分、异步外部存储、调整并行度。
- HBase:预分裂、散列前缀、反转时间戳、region 手工干预。
- ClickHouse:合理 shard key、避免超大分区、预聚合、分层物化视图。
4.6 设计层面如何规避
核心思路:
- 避免把“高频热点”设计成单点 Key。
- 避免用单调递增字段直接做主分片键。
- 避免把所有流量压到一个窗口、一个分区、一个任务上。
加分点:
- 设计时就要评估 Key 分布、QPS 热点、时间热点、状态规模。
- 任何“看起来很自然”的业务键,都可能在规模放大后变成热点键。
5. 存储与计算优化专题(★★★★★)
5.1 存储格式选型
一句话结论: 列式适合分析,行式适合写入和点查,混合存储适合同时兼顾写和读。
- Parquet:通用列式,压缩和扫描性能好,OLAP 场景最常见。
- ORC:Hive 生态里很常见,列式和统计信息支持好。
- Avro:更适合行式交换和 Schema 演进,不适合重分析。
- 行式:适合事务写入、消息记录、逐条读写。
面试怎么说:
- 只要是大宽表、聚合分析、范围扫描,优先考虑列式。
- 只要是高频单行写、点查、事务更新,优先考虑行式或行列混合。
5.2 压缩策略
基础版:
- Snappy:速度快,压缩率一般,适合实时和通用场景。
- ZSTD:压缩率和速度都不错,越来越常见。
- Gzip:压缩率高,但 CPU 开销大,不适合高吞吐在线链路。
进阶版:
- 压缩不是越强越好,要看 CPU、IO、网络和查询延迟的整体平衡。
- 列式文件通常配合字典编码、RLE、Delta、Bit-packing 等编码方式。
5.3 分区 / 分桶 / 分片设计
分区:
- 适合做大范围裁剪,常见按日期、小时、地区、业务域。
- 分区字段要低到中等基数,避免爆炸式分区。
分桶 / 分片:
- 适合解决 join 和并行度问题。
- 常按用户 ID、订单 ID、设备 ID、商户 ID 等稳定键来做 hash。
加分版:
- 分区负责“少扫”,分桶负责“好并行、好 join”。
- 真正成熟的表设计会同时考虑查询裁剪、数据分布和写入代价。
5.4 冷热数据分层
基础版:
- 热数据:最近数据,访问频繁,放低延迟存储。
- 冷数据:历史数据,少访问,放低成本存储。
进阶版:
- 热冷分层通常和生命周期、归档、压缩、清理联动。
- 如果业务有回放和审计要求,冷数据不能直接删掉,只能迁移。
5.5 小文件治理
为什么会有小文件:
- 流式写入频繁滚动。
- 分区过细。
- 任务并发过高、单次写入量太小。
治理手段:
- 合并写入批次,调大滚动阈值。
- 后台 compaction / merge。
- 降低过度并行,按分区聚合后再落盘。
- 通过 table service、异步合并、定期压缩解决。
易错点:
- 小文件治理不是只靠离线合并,写入侧就要控制文件生成策略。
5.6 计算引擎选型
- Spark:批处理、ETL、宽表加工、SQL 分析、离线重算。
- Flink:低延迟流处理、状态计算、实时聚合、事件驱动。
- Hive:传统离线 SQL、重资产 Hadoop 生态、兼容性场景。
- ClickHouse:高并发 OLAP、明细检索、聚合查询、实时报表。
- Trino / Presto:联邦查询、多源 SQL 统一入口。
5.7 并行度设计
基础版:
- 并行度不是越大越好,太小吃不满资源,太大增加调度和 shuffle 开销。
进阶版:
- 并行度要结合 source 分片数、shuffle key 分布、sink 承载能力、状态大小来定。
- 流式任务要考虑 checkpoint、backpressure 和 state backend 能力。
5.8 内存管理
核心关注点:
- 执行内存、存储内存、状态内存、堆外内存、spill、GC。
面试回答:
- 内存优化不是单纯“加机器”,而是减少 shuffle、减少宽行、减少对象数、减少序列化开销。
5.9 序列化优化
基础版:
- 避免 Java 原生序列化。
- 优先用 Avro、Protobuf、Kryo 等更高效的序列化方式。
进阶版:
- 序列化优化和 schema 设计、字段裁剪、网络传输、状态存储都有关。
- 线上性能差的时候,往往不是 SQL 慢,而是对象创建和序列化太重。
6. 实时与离线架构专题(★★★★★)
6.1 离线架构流程
1 | flowchart LR |
离线链路特点:
- 适合全量、回补、历史分析、复杂 join、大宽表构建。
- 优点是吞吐高、成本相对可控、逻辑复杂度容易收敛。
- 缺点是延迟较高,不适合秒级业务。
6.2 实时架构流程
1 | flowchart LR |
实时链路特点:
- 核心是低延迟、可恢复、可重放、可观测。
- 一般需要关注 watermark、checkpoint、状态大小、消费堆积和下游写入能力。
6.3 流批一体架构
一句话结论: 流批一体不是“一个任务同时跑所有逻辑”,而是“同一套数据模型、同一套口径、流批共同服务”。
加分回答:
- 实时负责新鲜度,离线负责准确性和回补。
- 两条链路共享指标定义、维表版本、质量规则和元数据。
- 真正难的是“同口径”,不是“同 SQL”。
6.4 Lambda 架构 vs Kappa 架构
1 | flowchart TB |
Lambda:
- 优点:批流分离,准确性和实时性都有兜底。
- 缺点:双链路维护成本高,口径容易不一致。
Kappa:
- 优点:逻辑更统一,开发运维成本更低。
- 缺点:对日志回放、状态恢复、流处理能力要求更高。
面试结论:
- 现在大多数新平台更偏 Kappa 思想或“流批统一”的演进方案。
- 只在强历史重算、批处理很重、组织能力不足时,Lambda 仍然有现实价值。
6.5 数据流转链路、口径统一、延迟保障
口径统一怎么做:
- 指标中心化定义。
- 维表版本化管理。
- 统一时间语义和业务日历。
- 统一过滤条件和去重规则。
延迟保障怎么做:
- 减少大 shuffle、热点 key、复杂 UDF。
- 使用预聚合、局部聚合、异步 I/O。
- 合理设置并行度、checkpoint 间隔、batch size、sink flush 策略。
6.6 高可用设计
关键点:
- 消息层要有副本、ISR、消费组重平衡和重放能力。
- 计算层要有 checkpoint/savepoint、leader 选举、failover。
- 存储层要有副本、快照、元数据备份和恢复演练。
- 服务层要有熔断、降级、限流和只读兜底。
7. 集群与运维专题(★★★★)
7.1 集群高可用方案
基础版:
- 主从切换、双副本、多副本、心跳检测、故障转移。
进阶版:
- NameNode / ResourceManager / JobManager / Metadata Service 这类核心节点都要做主备。
- 数据层要优先考虑副本、检查点、快照和重放。
加分版:
- 真正的 HA 不是“挂了能切”,而是“切了后语义还对、数据还在、业务还能稳住”。
7.2 扩容缩容
- 扩容前先看资源瓶颈:CPU、内存、IO、网络、状态、磁盘。
- 扩容后要重新平衡分片、分区、region、任务并行度。
- 缩容要先迁移热点数据和状态,避免直接摘机器导致雪崩。
7.3 监控体系
至少要看四层:
- 基础设施:CPU、内存、磁盘、网络、GC。
- 引擎层:checkpoint、lag、shuffle、spill、watermark、task 长尾。
- 数据层:行数、分区数、迟到率、重复率、质量规则。
- 业务层:指标波动、看板延迟、风控误报率、接口 SLA。
7.4 备份恢复
- 配置要备份。
- 元数据要备份。
- 核心表要有快照和恢复演练。
- 恢复要验证口径、版本和权限。
7.5 容灾设计
基础版:
- 同机房高可用解决的是“单点故障”。
- 异地容灾解决的是“机房级故障”。
进阶版:
- 要区分 RPO 和 RTO。
- 容灾方案常见有主备、双活、异步复制、只读热备。
7.6 权限控制、版本升级、故障自愈
- 权限控制要做 RBAC、最小权限、审计。
- 版本升级要看兼容矩阵、先灰度、再全量、可回滚。
- 故障自愈要有健康检查、自动重启、任务迁移、异常隔离和告警联动。
8. 高频对比选型面试专项
8.1 Hadoop vs Spark vs Flink
| 维度 | Hadoop | Spark | Flink |
|---|---|---|---|
| 核心定位 | 分布式存储 + 离线计算底座 | 通用批处理 / SQL / 流批融合 | 原生流处理 / 状态计算 |
| 典型延迟 | 高 | 中 | 低 |
| 适合场景 | 大规模离线、存储、传统生态 | ETL、批处理、交互式 SQL | 实时计算、风控、事件驱动 |
| 一致性 | 依赖上层实现 | 批处理容易,流式需配合语义 | 状态 + checkpoint + exactly-once 体系成熟 |
面试结论: Hadoop 更像“底座”,Spark 更像“通用计算引擎”,Flink 更像“实时状态计算引擎”。
8.2 Hive vs ClickHouse vs Spark SQL
| 维度 | Hive | ClickHouse | Spark SQL |
|---|---|---|---|
| 核心定位 | SQL-on-Hadoop | 高性能 OLAP | 分布式 SQL / ETL |
| 优势 | 生态成熟、离线稳定 | 查询快、聚合强、实时分析好 | 灵活、和 ETL 一体化 |
| 劣势 | 交互慢、实时性弱 | 写入模式和事务能力不是主打 | 实时服务能力不如专用 OLAP |
| 适合场景 | 离线报表、历史分析 | 明细查询、实时看板、聚合分析 | 数仓加工、临时分析、批式 SQL |
面试结论: Hive 偏离线,ClickHouse 偏查询服务,Spark SQL 偏计算加工。
8.3 HBase vs Cassandra vs MongoDB
| 维度 | HBase | Cassandra | MongoDB |
|---|---|---|---|
| 核心模型 | 宽表 / 列族 | 宽列 / 去中心化 | 文档模型 |
| 一致性 | 强一致倾向 | AP 倾向,最终一致更常见 | 支持事务与较灵活读写 |
| 优势 | 大规模随机读写、RowKey 可控 | 高可用、高写入、水平扩展 | Schema 灵活、开发效率高 |
| 适合场景 | 明细存储、画像、时序宽表 | 海量写入、多副本、去中心化 | 业务文档、半结构化数据、内容管理 |
面试结论: HBase 更适合“按 RowKey 精准查和写”,Cassandra 更适合“高可用高写入”,MongoDB 更适合“文档与灵活 Schema”。
8.4 Spark Streaming vs Flink vs Kafka Streams
| 维度 | Spark Streaming | Flink | Kafka Streams |
|---|---|---|---|
| 模型 | 微批 | 真流 | 库式流处理 |
| 部署形态 | 独立集群 | 独立集群 | 嵌入应用 |
| 状态能力 | 有 | 强 | 依赖 Kafka 生态 |
| 适合场景 | 旧链路、微批容忍 | 实时数仓、风控、复杂状态 | 轻量流处理、Kafka 原生处理 |
面试结论: 新项目一般优先 Flink;Kafka Streams 适合贴近业务服务;Spark Streaming 现在更多是历史兼容。
8.5 Elasticsearch vs Solr vs ClickHouse
| 维度 | Elasticsearch | Solr | ClickHouse |
|---|---|---|---|
| 核心定位 | 搜索 + 聚合 | 搜索 | OLAP 分析 |
| 强项 | 近实时搜索、生态、可观测 | 传统检索、Lucene 基础强 | 超快聚合、明细分析 |
| 弱项 | 复杂分析不是唯一强项 | 运维和生态相对传统 | 全文检索能力不是主战场 |
| 适合场景 | 日志检索、搜索、可观测 | 企业搜索、文档检索 | 看板、分析、实时指标 |
面试结论: 搜索选 ES/Solr,分析选 ClickHouse;如果一个系统想两头都占,通常需要明确主次。
8.6 Iceberg vs Paimon vs Hudi
| 维度 | Iceberg | Paimon | Hudi |
|---|---|---|---|
| 核心定位 | 开放表格式标准 | 实时湖仓 / 主键表 | upsert / 增量表格式 |
| 优势 | 多引擎友好、Schema 演进、隐藏分区 | 流批一体、CDC、主键更新强 | 增量拉取、表服务成熟、社区积累深 |
| 适合场景 | 多引擎分析、开放湖仓、标准化 | 实时湖仓、主键更新、Flink 场景 | upsert 多、增量消费重、存量系统改造 |
| 面试结论 | 更像“开放标准” | 更像“实时湖仓” | 更像“增量更新型湖仓” |
选型话术:
- 如果要多引擎统一和标准化,优先 Iceberg。
- 如果要实时 CDC、主键表、Flink 生态,优先 Paimon。
- 如果已有 Hudi 生态或更强调 upsert 和表服务,可以选 Hudi。
8.7 Lambda vs Kappa
| 维度 | Lambda | Kappa |
|---|---|---|
| 架构思路 | 批 + 流双链路 | 单一日志流 |
| 优点 | 历史重算稳 | 逻辑统一、运维更轻 |
| 缺点 | 成本高、口径容易分裂 | 对流处理和回放能力要求高 |
面试结论: 新平台大多更偏 Kappa 思想,但在复杂历史重算和组织分工不成熟的环境里,Lambda 仍然能落地。
8.8 行存 vs 列存 vs 行列混合
| 维度 | 行存 | 列存 | 行列混合 |
|---|---|---|---|
| 优势 | 写入快、点查快 | 扫描和聚合快、压缩高 | 兼顾写和读 |
| 劣势 | 分析性能差 | 行级更新和点查较弱 | 实现更复杂 |
| 适合场景 | 交易、KV、文档 | OLAP、报表 | 实时湖仓、混合负载 |
8.9 批处理 vs 流处理 vs 流批一体
| 维度 | 批处理 | 流处理 | 流批一体 |
|---|---|---|---|
| 核心目标 | 吞吐和全量 | 低延迟和持续更新 | 同口径、统一模型 |
| 数据形态 | 有界 | 无界 | 两者兼顾 |
| 典型引擎 | Spark / Hive | Flink | Iceberg/Paimon/Hudi + Spark/Flink |
9. 综合场景设计面试专项
9.1 设计亿级用户行为分析平台(实时 + 离线)
目标: 同时支持秒级看板、日级报表、用户画像、推荐特征和历史回放。
推荐架构:
- 采集层:埋点 SDK、日志采集、CDC。
- 消息层:Kafka 作为统一事件总线。
- 实时层:Flink 做实时清洗、聚合、特征生成。
- 离线层:Spark 做重算、补数、历史宽表构建。
- 存储层:Iceberg / Paimon / ClickHouse 组合。
关键设计:
- 统一事件 ID、用户 ID、时间语义。
- 实时负责新鲜度,离线负责准确性和重放。
- 画像和特征要可回溯、可版本化、可补数。
常见追问:
- 如何处理埋点重复和乱序。
- 如何保证实时和离线口径一致。
- 如何做热点用户和高峰流量治理。
9.2 设计实时风控与反欺诈系统
目标: 低延迟地识别可疑交易、可疑登录、异常设备和高风险行为。
推荐架构:
- Kafka 接入交易事件、设备事件、登录事件。
- Flink 做规则流、特征流、状态匹配和窗口聚合。
- 实时特征写入 Redis / HBase / Paimon / Online Feature Store。
- 决策层把规则评分、模型评分、黑白名单、历史画像融合。
关键设计:
- 规则引擎和模型评分要分层,不要把所有逻辑塞一个 SQL。
- 状态要设计 TTL,避免无界增长。
- 需要支持低延迟查询、快速回滚和人工审核。
常见追问:
- 如何防重复告警。
- 如何处理迟到事件。
- 如何做规则版本切换和灰度发布。
9.3 设计企业级湖仓一体数据平台
目标: 统一存储、统一治理、统一元数据、统一多引擎访问。
推荐架构:
- 存储层:对象存储 + Iceberg/Paimon/Hudi。
- 计算层:Spark + Flink + Trino + ClickHouse。
- 治理层:Catalog、权限、血缘、质量、生命周期。
- 服务层:BI、API、特征服务、数据共享。
关键设计:
- 统一 Catalog 和命名空间。
- Schema 演进、分区演进、版本回溯都要支持。
- 读写分离、多引擎并发访问要考虑锁、元数据一致性和提交协议。
常见追问:
- 为什么选 Iceberg / Paimon / Hudi。
- 如何支持增量消费。
- 如何做表级权限和审计。
9.4 设计海量日志存储与检索分析系统
目标: 支持日志接入、检索、聚合、问题排查、可观测分析。
推荐架构:
- 接入层:Agent / Log Shipper。
- 消息层:Kafka。
- 存储层:对象存储 + ClickHouse + Elasticsearch 组合。
- 查询层:全文检索用 ES/Solr,聚合分析用 ClickHouse。
关键设计:
- 日志要标准化字段,至少包含 trace_id、service、level、timestamp、host、env。
- 热日志放近线系统,冷日志归档到湖。
- 检索和分析分工明确,不要强求一个引擎全做。
9.5 设计高并发订单 / 交易数据存储与处理架构
目标: 保证写入不丢、订单状态可追踪、查询低延迟、账实一致。
推荐架构:
- 交易主库负责强一致写入。
- CDC 推送到 Kafka。
- Flink 处理状态流、对账流、指标流。
- HBase / Cassandra / Kafka + Lakehouse 负责高并发查询和分析侧扩展。
关键设计:
- 订单号、流水号、状态机必须设计唯一键和版本号。
- 对账和补偿链路要独立于主交易链路。
- 幂等是底线,重复消息不能重复扣款。
9.6 设计物联网海量设备数据实时处理平台
目标: 接入海量设备上报,支持状态监控、告警、轨迹分析和设备画像。
推荐架构:
- 设备 -> MQ -> Flink -> 实时存储 + 湖仓。
- 设备维表、区域维表、协议维表独立管理。
- 终端状态和告警结果写入 KV / OLAP / 搜索引擎。
关键设计:
- 设备 ID 是天然热点候选,要防倾斜。
- 需要处理离线设备、断线重连、乱序上报和批量补报。
- 状态过期和设备生命周期要关联。
9.7 解决高并发写入 + 海量存储 + 低延迟查询
推荐思路:
- 写入层用 Kafka / CDC 做缓冲。
- 存储层用分层架构:热层 OLAP/KV,冷层湖仓。
- 查询层按场景分流:明细走 OLAP 或搜索,历史走湖,点查走 KV。
关键点:
- 不要让一个系统同时承担所有负载。
- 热点写入要通过分片、哈希、预聚合和异步合并拆掉。
9.8 设计数据中台的统一存储与计算层架构
推荐答案:
- 存储统一:对象存储 + 开放表格式。
- 计算统一:批流统一的执行引擎组合。
- 语义统一:指标中心、维表中心、血缘中心。
- 治理统一:权限、质量、审计、生命周期。
加分点:
- 数据中台不是“做一个大仓库”,而是“把数据能力产品化”。
- 最重要的是减少重复加工和重复口径。
9.9 设计跨集群 / 跨机房的数据同步与容灾方案
推荐架构:
- 源集群通过 CDC / Mirror / Replication 进入中转层。
- 中转层保留可重放日志和校验信息。
- 目标集群按延迟等级做异步复制或准实时同步。
关键设计:
- 要明确 RPO / RTO。
- 关键链路要支持回放和对账。
- 需要预案:切流、回切、双写冲突、版本回滚。
9.10 设计数据质量与数据治理体系方案
推荐回答:
- 先有标准:指标口径、数据字典、血缘、分层规范。
- 再有规则:完整性、准确性、时效性、唯一性、一致性。
- 再有闭环:发现、告警、定位、修复、复盘、知识沉淀。
加分点:
- 治理不是一次性项目,而是持续运营。
- 最好的治理结果是“问题越来越少,口径越来越统一,使用越来越简单”。
10. 面试速背清单
10.1 一句话定论
- 数仓分层的核心是解耦、复用和统一口径。
- 维度建模适合分析,范式建模适合一致性。
- SCD 解决的是历史怎么保留的问题。
- Exactly-Once 是逻辑语义,不是魔法。
- 幂等是高并发数据系统的底线。
- 倾斜的本质是分布不均,不是机器不够快。
- 列存适合分析,行存适合写入,混合存储适合混合负载。
- 实时链路追求低延迟,离线链路追求可重算和全量准确。
- 湖仓一体的关键是开放格式 + 多引擎 + 治理。
10.2 常见追问准备
- 为什么不用一个表直接给所有人查。
- 为什么不用双写而要走 CDC。
- 为什么实时和离线会有口径差。
- 为什么热点 key 会拖垮整条链路。
- 为什么某些场景要选 Iceberg,某些场景要选 Paimon。
11. 官方版本参考
以下是本文版本线和趋势判断时参考的官方页面,适合你后续继续查最新变化:
- Spark:downloads
- Flink:downloads
- Hadoop:releases
- Kafka:downloads
- Iceberg:latest docs
- Paimon:1.4 stable docs
- Hudi:releases
- ClickHouse:changelog
- HBase:downloads
- Cassandra:download
- Solr:downloads
- MongoDB:release notes
- Elasticsearch:downloads
12. 复习建议
如果你要把这份手册真正背下来,最有效的方法不是一页页看,而是按题型刷:
- 先把“数据仓库专题”和“实时一致性专题”背熟。
- 再把“数据倾斜”和“存储优化”刷成条件反射。
- 再用“对比选型”训练自己的结论表达。
- 最后用“综合场景设计”练架构完整度和取舍能力。
真正的大厂面试,通常不是看你会不会背定义,而是看你能不能在约束下做出稳定、可解释、可运维的系统设计。
__END__