数据工程师面试题,按轮次划分
作者 Aaron Cao · 更新于

数据工程师面试通常包括高级SQL、数据建模、管道与ETL设计、分布式处理和行为面试等轮次。管道设计轮次决定了大多数结果:它考察你如何处理延迟到达的数据、重跑和故障,而不是你偏好哪种工具。
数据工程师面试包含哪些轮次?
你可能一直在按照软件工程师面试的方式准备,想知道数据工程师面试有什么不同。本节梳理这些面试反复出现的轮次,让你把精力放在真正拉开候选人差距的两个环节上。技术筛选环节很少是拿不到offer的原因。
- SQL。窗口函数、去重和查询性能,通常是现场手写。
- 数据建模。为给定的业务场景设计表结构,并为你选择的粒度做辩护。
- 管道与ETL设计。一个聚焦于数据流转的开放式系统设计轮次。
- 分布式处理。某个框架实际是如何执行你的任务的,以及它为什么变慢。
- 编码。Python或Scala,通常比软件工程轮次要轻。
- 行为面试。值班事故、坏掉的仪表盘,以及昨天就想要结果的相关方。
这些职位头衔与分析工程和平台类岗位高度重叠,因此考察内容会有所不同。相关的分角色题库见按角色划分的面试问题枢纽页。
会出现哪些SQL和数据建模问题?
SQL
- 对一张表去重,每个键只保留最新的一行。
- 写一个查询,用30分钟不活跃间隔来计算每个用户的会话数。
- 在一个查询里同时计算累计总和与环比变化。
- 找出昨天快照中存在、但今天快照中缺失的行。
QUALIFY是做什么用的?如果不用它,你会怎么写?- 这个查询扫描了十亿行数据,耗时二十分钟。你会如何诊断?
- 解释分区(partitioning)和聚簇(clustering)的区别,以及各自适用的场景。
数据建模
- 为一个在线交易市场的订单历史设计表结构。你的事实表粒度是什么?
- 解释星型模式,以及你什么时候会主动进一步反规范化。
- 什么是缓变维度?你会如何实现二型?
- 某相关方希望历史报表反映客户当前所在的地区。这会导致什么问题?
- 你会如何为一个乱序到达的事件流建模?
- 什么时候你会选择宽表而不是规范化模型?
建模轮次奖励的是敢于确定一种粒度并为之辩护的人。那些描述了三种可能设计却始终没有做出选择的候选人,得分通常低于选定一个合理设计并指出其弱点的候选人。
会出现哪些管道和分布式处理问题?
管道与ETL设计
- 设计一个将每日交易数据加载到数据仓库以供报表使用的管道。
- 上游数据源把昨天的数据又发了一遍。你的任务会发生什么?
- 你会如何让一个管道具备幂等性?这对重跑为什么重要?
- 你会如何在不打断每日加载的情况下回填两年的历史数据?
- 某个分区已经关闭三天后,延迟到达的数据才出现。你会怎么做?
- 你会如何检测出一个管道运行成功了,但产出的数据是错误的?
- 你会监控什么指标?凌晨三点会因为什么而呼叫你?
分布式处理与流处理
- 什么会导致shuffle?为什么它的代价很高?
- 你的任务运行很慢,其中一个task耗时远超其他task。发生了什么?
- 解释数据倾斜(data skew),以及两种应对方法。
- 什么时候你会选择流处理而不是定时批处理任务?
- 「恰好一次」处理到底保证了什么?在哪些情况下它并不成立?
- 在窗口聚合中,水位线(watermark)是如何处理乱序事件的?
请注意,这些问题里很少要求你说出一个具体工具的名字。说出工具名只是回答的开始,而不是答案本身。后续追问永远是为什么,以及会出什么问题。
你应该如何练习这些问题?
阅读这些题目列表能建立识别能力。而设计轮次考察的是另一种能力:在有人不断用故障场景打断你的情况下,仍能把整个系统装在脑子里。这种能力只能通过大声说出你的设计来获得。
- 用十五分钟画出并讲述一个管道。数据源、落地、转换、服务,加上每个环节可能如何失败。
- 攻击你自己的设计。每次练习结束后,问自己:重跑会怎样?延迟数据会怎样?schema变更会怎样?
- 准备好一个规模数字。每天的行数、数据大小、延迟预算。先说出你假设的规模会加分。
- 手写SQL。现场轮次常常只给一个没有自动补全、也不能执行的纯文本编辑器。
- 认真演练一个事故故事。出了什么问题、你是怎么发现的、你做了什么改动让它不再发生。
一位在批处理管道上有六年经验的数据工程师,准备时复习了框架内部原理,却在「上游数据源重新发送了昨天的文件」这个问题上卡住了,因为她过去只是手动处理过,从没有把它讲清楚过。知识是有的,但口头表达没有跟上。带着追问练习设计轮次,正是模拟面试模式存在的意义。
常见问题
数据工程师面试和软件工程师面试有什么不同?
编码轮次通常更轻,设计轮次聚焦于数据流转而非服务架构。问题会围绕重跑、延迟数据和schema变更下的正确性展开,这些在通用软件设计轮次中很少出现。
我需要专门掌握Spark吗,还是理解概念就够了?
概念承担了这一轮大部分的分量:shuffle、数据倾斜、分区,以及任务为什么变慢。如果职位描述里点名了某个框架,预期至少会被问到一个关于其执行模型的问题,所以要能解释你的任务运行时发生了什么。
这类面试会考察多少数据建模内容?
比大多数候选人预期的要多。星型模式、事实表粒度和缓变维度会经常出现,面试官会追问你选择的后果,而不是让你背教科书定义。
候选人未能通过数据工程师面试最常见的原因是什么?
设计出的管道只能在理想路径上运行。面试官会故意引入重跑、重复投递和延迟到达的数据,而对此毫无应对方案的设计,通常就是最常见的失败原因。
我该如何独自练习设计轮次?
选定一个给定的业务场景,掐着时间大声设计管道,然后用故障场景来拷问自己的设计。AI模拟面试官也可以主持这一轮,并用追问打断你,这更接近真实的压力感。