华勤数据开发面经:数仓分层、Hive 与 Spark SQL 细节追问
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 请先简单做个自我介绍。
- 你现在是在校状态吗?学校在哪个城市?你是哪里人?考虑发展的城市有哪些?
- 上一段实习有半年,为什么干了这么久?为什么没有留下来?
- 看板主要是用的什么工具?
- 你能简单介绍一下完成需求时的数据链路吗?比如从哪里拿的数据、做了哪些加工,最后报表端如何呈现、交付给报表使用方。
- 这边用的也是 Hive 吗?
- 它底层的引擎是什么?
- 你从上游数据来源接入到 ODS 层,接触过程中有碰到什么问题吗?
- 你这半年做的项目,是很多临时小需求,还是参与一整个完整项目?
- 这个项目主要是为了实现什么?
- 你讲一下你对数仓的理解。
- 你讲一下 Hive 和 MySQL 有什么区别?
- 你交付到 MySQL,他们后续会怎么使用?
- 也就是说看板这块不是你负责,由其他岗位完成是吗?
- 你用了这么多大数据组件,你对这些组件的基本原理熟悉多少?
- Spark 底层有了解吗?比如 Spark 的内存管理是如何进行的?
- 你用的是 Spark SQL 还是什么?
- 你上面提到的水印,Flink 用了吗?
- 你主要用的就是 Spark SQL 是吧?Hive 接触多不多?有没有实际使用场景?
- 有没有使用一些 AI 工具做相关研究?有没有尝试过自己写一些实用性的工具?
- 你是广东人吗?期望的工作城市只有广东,还是其他城市都可以?
- 我看你做过学生会主席,是院系还是校学生会?平时会组织什么样的活动?
- 你这边有什么需要咨询的吗?
《参考解析》
数仓分层要答出「收益与代价」,而不是背层级名字:ODS、DWD、DWS、ADS 这套划分的意义在于把「原始数据」和「口径」解耦。不分层、直接从原始数据一次算到指标层,短期看少了几次落表、跑得更快,但指标一改就要动全链路,出了问题只能在「原始数据」和「成品」之间二分查找,中间没有任何可对比的痕迹;分层之后,改口径落在 ADS、改聚合维度落在 DWS,改动的爆炸半径被限制在一层,并且每层的表可以复用给别的业务线——这一点在面经里格外值得说,因为复用是分层最实际的收益。代价同样要说:链路变长会带来额外的计算与存储开销、调度依赖变复杂、每一层都要做治理(分区裁剪、生命周期、小文件合并、资源与耗时监控)。被追问「什么时候可以不分层」时,可以答数据量小、需求稳定、只有一两个固定报表的场景,多一层的收益抵不上维护成本。
Hive 与 MySQL 的区别要落到「各自的活」上:Hive 是面向离线批处理的 SQL 引擎,表本质上是 HDFS 上的目录加元数据,SQL 最终编译成分布式作业在集群上跑,擅长全表扫描、大规模聚合,延迟以分钟计,而且不擅长高并发的点查与行级更新。MySQL 是行存的 OLTP 数据库,有索引和事务,适合低延迟查询与结果存储。所以两者常常串起来用:Hive 侧产出宽表与指标,再把结果同步到 MySQL 供 BI 或业务系统查询。这里有一个高频追问点——「同步过去之后他们怎么用」:是报表工具直连、还是业务系统读、是全量覆盖还是增量更新、失败了怎么补数、口径以哪边为准。回答里把这几个问题说清楚,比背 Hive 与 MySQL 的技术参数更像做过链路。顺带要能答 Hive 底层引擎:常见是 MapReduce、Tez 或 Spark,同一句 SQL 换引擎会明显改变执行计划与耗时;被问「你们底层引擎是什么」时,结合自己集群里的实际配置答,不要含糊。
「介绍你的数据链路」是这场面试的主线,要能按数据流讲一遍:稳妥的讲法是一条线走到底:上游有哪些来源(业务库、日志、埋点、接口),怎么接进 ODS(全量快照还是增量抽取、按天分区还是按小时),在 DWD 做了哪些清洗与规范化(去重、空值、单位与字典统一、拉链表或快照处理),DWS 怎么聚合、ADS 怎么出指标,最后交付形式是什么(看板、报表、接口、给下游团队的表),以及调度依赖、产出时间、失败重试与数据质量校验挂在哪一步。面试官问「接上游碰到什么问题」,考的其实是真实经历,常见答案有:上游字段变更或延迟导致任务空跑、主键不唯一带来的重复数据、编码与时区不一致、业务口径临时变化、历史数据补数。答的时候要说清「怎么发现的、怎么定位的、最后怎么修的」,只说「沟通解决了」会显得没做过。
Spark 内存管理与「水印」这类概念题,答之前先分清自己用没用过:Spark 的执行内存与存储内存由统一内存管理器分配,两块默认各占一半且可以互相借用,执行内存不足时会 spill 到磁盘,这也是为什么「加大 executor 内存」不总能解决 OOM——更常见的原因是分区数据倾斜、单分区过大或缓存过多。Spark SQL 走的还是 Catalyst 优化器加代码生成这套,join 策略、分区数、是否有 shuffle 都会显著影响耗时。数据倾斜的典型表现是少数 task 长时间不结束、shuffle 读写量远高于平均、频繁 spill;处理手段包括加盐打散热点 key、把大表带小表的 join 转成广播、过滤空 key、调并行度。关于水印:它是流处理里的概念,表示「晚于这个时间到达的数据按迟到处理」,配合窗口与允许迟到时长使用,Spark Structured Streaming 和 Flink 都有对应机制。原帖面试官正是抓住候选人自己提过的「水印」去问 Flink 用没用——这类追问的用意是分辨「背过概念」还是「真在项目里用过」,所以最稳的答法是明确区分:哪些组件是自己写 SQL 天天用的,哪些只是了解原理、看过文档,别把了解说成实战。
AI 工具与个人问题:给具体做法,别给态度:被问有没有用 AI 做数研、有没有自己写过实用工具时,回答要落在「用它做了什么、怎么保证结果可用」。例如用模型辅助写 Hive SQL 与 DDL、根据报错日志定位问题、把重复的口径说明整理成文档模板,同时说明验证方式(小样本对账、先跑 limit、与既有指标比对)。自己写的小工具可以是调度告警聚合、表血缘导出、字段说明生成这类贴身的东西,说清解决了自己什么痛点就够了。至于实习时长、为什么没留用、期望城市、学生会经历这些,考的是稳定性和表达的一致性,答法是一是一、二是二,给确定的范围而不是含糊的「都可以」,同一件事在 HR 面和业务面说法要能对上。最后的反问环节是加分项:问团队承担的活儿、数据团队规模、AI 在团队里的落地程度,比问薪资更能得到有效信息。