第4章 离线数仓技术栈面试:Hive优化、Spark调优、数仓分层、建模方法
本章聚焦离线数仓面试核心四块:Hive 查询优化、Spark 作业调优、数仓分层设计、维度建模与事实建模。以下通过回答框架、面试问答卡片、真实项目模板帮你快速掌握考点与表达逻辑。
3个面试问答卡片
❓ 面试问题:Hive 查询很慢,你一般从哪些方向去优化?
🎯 考察点:是否具备系统性的 Hive 调优意识,能否结合实际业务场景给出合理方案。
📐 回答框架:① 数据存储优化(分区/分桶/列式存储)→ ② SQL 执行优化(MapJoin、谓词下推、减少Shuffle)→ ③ 参数调优(并行度、内存、压缩)→ ④ 数据倾斜处理(热点key打散、两阶段聚合)。
✍️ 示例回答:一般先检查扫描量,通过分区裁剪减少输入;对关联较多的大表用 MapJoin 避免 Shuffle;若发现数据倾斜,用 salted key 打散或两阶段聚合。再配合启用 Tez 引擎、增大 container 内存。
🔍 可能追问:MapJoin 默认触发条件是什么?如果左右表都很大怎么办?动态分区插入怎么优化小文件?
❓ 面试问题:Spark 作业运行缓慢或频繁 OOM,你如何调优?
🎯 考察点:对 Spark 内存模型、执行计划、参数调整的理解,以及排查思路。
📐 回答框架:① 分析阶段(查看 Spark UI / SQL 执行计划)→ ② 资源参数(executor 内存/核数、并行度、序列化)→ ③ 数据本地性 → ④ AQE + 动态分区写入 → ⑤ 代码优化(reduceByKey 替代 groupByKey、避免 OOM)。
✍️ 示例回答:先根据 Spark UI 看 Stage 耗时和 Shuffle 数据量;对数据倾斜用 repartition 重分区或配置 spark.sql.adaptive.enabled=true;内存方面设置 spark.executor.memory=4g,off-heap 用于缓存中间结果。
🔍 可能追问:AQE 原理是什么?你遇到过数据倾斜导致 OOM 吗?怎么定位是哪个 Stage 出了问题?
❓ 面试问题:为什么数仓要分层?你是怎么设计离线数仓的分层和建模的?
🎯 考察点:对数据架构成熟度的理解,能否结合业务讲清楚分层逻辑与建模选择。
📐 回答框架:① 分层目的(解耦、复用、性能、安全)→ ② 常用分层(ODS/DWD/DWS/ADS)及各层职责 → ③ 建模方法(维度建模 星型/雪花型)→ ④ 事实表分类(事务、周期快照、累积快照)→ ⑤ 缓慢渐变维度处理(Type1/2/3)。
✍️ 示例回答:我们按 ODS 原始数据 → DWD 清洗去重 → DWS 轻度聚合宽表 → ADS 应用集市。建模用星型模型,事实表存放交易度量,维度表如时间、用户、商品用代理键关联,对用户属性变更采用 Type2 拉链表记录。
🔍 可能追问:ODS 数据增量怎么管理?如何保证 DWD 和 DWS 一致性?跨层血缘追踪怎么做?