模拟面试记录整理
面试岗位:后端开发工程师(大数据&大模型方向)
候选人背景:8年研发经验(5年运维开发 + 3年数据/大模型工程),当前为数据研发工程师
面试形式:技术深度问答,重点考察工程落地、性能调优、架构取舍与底层运维思维
问题 1:特征工程管道(双流程:离线全量 + 在线增量)
📌 面试官提问
你在简历中提到,利用 DeepSeek 和 sentence-transformer 构建了“离线全量 + 在线增量”双流程 Pipeline,将新应用召回生效时间从天级缩短至分钟级。
追问 1(实时性):在线增量流程通过“DMQ 触发”,从应用上架消息产生、到向量生成、再到同步至 ES/DCS,端到端 P99 延迟是多少?若大模型推理超时,降级策略是什么?
追问 2(成本与性能):离线全量刷新时如何避免资源争抢?ES 向量更新采用 Reindex 还是增量 Merge?
💬 原始回答(候选人)
实时性:以摘要向量生成为例,端到端过程(请求大模型转摘要 → 向量化 → 推送 ES)需 15~30 秒。但为了避免上游微服务超时,收到请求后立即返回消息(异步处理),因此服务观测到的 P99 在 10ms 以内。
降级策略:采用阶梯重试(1s、3s、5s),若仍超时则依赖离线全量流程重新生成该增量应用。
资源与更新:特征生成任务部署在 MLOps 平台的专属资源租户,夜间低峰期执行,很少资源不足。ES 索引更新未提及具体策略(隐含使用常规更新)。
👨💼 面试官即时点评
回答务实,异步解耦思路正确,P99 的 API 层延迟控制合理。但对 ES 大规模向量更新的工程细节(如 Reindex 切换 vs 增量 Merge)未展开,这部分是架构深度的体现。
🚀 改进建议与期望答案
(1)关于端到端延迟与超时
- 除重试外,应增加熔断与降级:若大模型连续超时,立即切换至最近一次离线生成的向量(即使该应用尚未更新),保证召回不为空。同时设置超时预算,例如整体链路不得超过 30s,否则标记失败进入死信队列,由离线任务补偿。
(2)关于 ES 向量更新
- 离线全量:采用 Reindex 别名切换(创建新索引 → 写入 → 原子别名切换),避免在线服务中断。
- 在线增量:使用 ES 的 update 或 upsert 操作,仅更新单个文档,并控制 refresh_interval(如设为 30s)以减少段合并压力。
- 若增量更新频繁,可引入缓冲区(如 Redis 暂存最近 N 条变更),批量提交至 ES,降低索引操作开销。
(3)资源隔离
- 夜间离线任务应设置 Spark 动态资源分配(spark.dynamicAllocation.enabled=true)并限制最大 Executor 数,防止抢占在线任务的 YARN 资源。
问题 2:搜索质量数仓(ADS 宽表与数据倾斜)
📌 面试官提问
你独立设计开发了亿级搜索行为 ADS 宽表,打通“搜索词 ↔ 应用”双向指标链路。
追问:高频热词(如“微信”)在 SparkSQL Group By 或 Join 时易产生数据倾斜,请具体说明你是如何定位并优化的?是否用过加盐、Broadcast Join 或调整并行度?
💬 原始回答(候选人)
实际开发中并未明显感知严重倾斜。我的宽表聚合了搜索、曝光、点击、下载基础表,关联维度包括搜索词、榜单方案 ID、实验方案 ID、设备 ID、应用 ID,多维度分散了热点,分区无明显集中。后续按搜索词和应用统计也未出现严重倾斜。
至于 Broadcast Join,我确实用过,但并非解决倾斜,而是在关联一张小表(任务配置表)时避免 Shuffle,提高查询效率。
👨💼 面试官即时点评
多维度聚合确实可以避免单一热键倾斜,但面试官后续追问了极端场景(业务要求仅按搜索词聚合)的应对,候选人未能展开。Broadcast Join 的使用正确,但未体现对 Shuffle 倾斜的系统性解决方案。
🚀 改进建议与期望答案
面对热词聚合(GROUP BY query)的兜底方案:
-
开启 Spark AQE 自动优化(Spark 3.0+):
sql set spark.sql.adaptive.enabled=true; set spark.sql.adaptive.skewJoin.enabled=true; -- 自动检测并拆分倾斜分区 -
手动加盐两阶段聚合(通用解法):
sql -- 第一阶段:为热键添加随机后缀,打散到 N 个分区 WITH salted AS ( SELECT CASE WHEN query = '微信' THEN CONCAT('微信', '_', CAST(RAND()*100 AS INT)) ELSE query END as salted_query, 1 as cnt FROM logs ) -- 第二阶段:按真实 key 再聚合 SELECT REGEXP_EXTRACT(salted_query, '^(.*?)(_[0-9]+)?$', 1) as query, SUM(cnt) as total FROM ( SELECT salted_query, COUNT(1) as cnt FROM salted GROUP BY salted_query ) tmp GROUP BY REGEXP_EXTRACT(salted_query, '^(.*?)(_[0-9]+)?$', 1);
盐值数量(100)应远大于
spark.sql.shuffle.partitions(通常 200),确保热键被充分分散。
- 调整 Spark 参数:
spark.sql.shuffle.partitions适当增大(如 400~800)- 开启
spark.dynamicAllocation.enabled并设置spark.dynamicAllocation.maxExecutors上限
点评:数据倾斜是大数据岗位的”必考题”,建议候选人熟练掌握 AQE 和加盐两阶段聚合,并理解各自适用场景(Join vs Group By)。
问题 3:AI 智能 SQL 生成工具(Text-to-SQL)
📌 面试官提问
你提到制定了严格 SQL 生成规范(强制 GROUP BY、禁止 WITH/TEMP),并设计”复用优先”机制。
追问 1(安全与幻觉):禁止 WITH 子句会限制复杂查询,如何平衡安全性和复杂查询能力?
追问 2(血缘解析):当源表字段发生 DDL 变更时,知识库如何自动感知并更新?
💬 原始回答(候选人)
安全与复杂查询:该工具目前仅在本地使用,对已有查询会复用本地记录。新查询会逐步向用户确认表、关联逻辑,认可后才生成。即使上线,也应区分”探索”与”生产”,首次生成必须人工确认,可行后固化。
血缘感知:当前不具备自动感知能力,需要手动触发。工具分为 SQL 解析和 NL2SQL 两模块:解析模块生成表定义、逻辑及注意事项,更新 table_index 元数据;NL2SQL 依赖该元数据。因此需先执行解析,再生成 SQL。
👨💼 面试官即时点评
对安全边界的认知非常务实,”人工确认 + 复用”是落地 LLM 应用的成熟策略。但血缘自动感知的缺位是明显短板,若工具要推广至全公司,维护成本极高。
🚀 改进建议与期望答案
(1)平衡安全性与复杂查询
不采用”一刀切”禁止 WITH 子句,而是分级策略:
- 简单查询(单表聚合):允许模型自由生成。
- 复杂查询(多表 JOIN + 子查询):强制使用模板库(预置 20+ 常见分析模板),模型仅填充参数(如表名、时间范围),从根本上杜绝语法错误。
- 引入语法校验 + 执行计划模拟,在真正执行前预估数据量,对可疑 SQL 自动阻断并转人工。
(2)元数据自动同步(轻量级守护进程)
- 事件监听:订阅 Hive Metastore 的 ALTER TABLE 事件(通过 HMS 的 EventListener 或 Flink CDC)。
- 变更处理:
- 字段新增/重命名:更新元数据表,并标记对应字段为
DEPRECATED,但保留历史模板(软失效)。 - 字段删除:若该字段被已固化的查询模板引用,则主动失效该模板(强一致性),并通知负责人。
- 定时巡检:每日凌晨运行
DESCRIBE FORMATTED对比差异,双保险防止遗漏。
点评:自动化是工具规模化上线的必然要求,候选人需补充事件驱动设计和元数据管理经验。
问题 4:业务价值(”饿了么改名淘宝闪购”发现)
📌 面试官提问
你通过数据波动自动识别”饿了么改名淘宝闪购”事件,并推动修复 100+ Badcase。请还原定位根因的分析路径,以及如何区分算法迭代 vs 业务变更导致的变化。
💬 原始回答(候选人)
通过 CTR 异动监测报表发现特定词下 CTR 低于阈值。从搜索完整链路(QA 召回 → 排序 → 后处理)分析:
1. QA 词性识别将”饿了么”识别为单意图词,指向应用”饿了么”,但改名后该应用已不存在;
2. 结果导致排序得分下降,使饿了么未排在首位;
3. 根据”首次平均点击位置”指标,用户更倾向点击前三,首位点击明显更高;
4. 综合判断是改名导致排序靠后,进而引起 CTR 下滑。排除算法迭代:对比算法版本发布时间线,发现该异常与业务改名时间点吻合,而非算法上线时间。
👨💼 面试官即时点评
归因逻辑严谨,从指标异动到链路分析再到时间点比对,体现了很强的数据敏感性和业务理解。区分算法迭代 vs 业务变更的方法(时间线对照)也是标准做法。
🚀 改进建议
- 可增加流量对照:对比改名前后”饿了么”相关搜索词的曝光量是否不变,排除流量分配变化。
- 建议建立”外部事件字典”(如业务更名、重要版本发布),与内部指标异常自动关联,提升根因定位效率。
- 该案例可作为数据驱动业务的典型,面试中可适当突出”推动策略优化”的结果量化(如修复后 CTR 恢复幅度)。
问题 5:稳定性建设与 Linux 底层毛刺排查
📌 面试官提问
假设向量检索服务(ES/DCS)高峰期 CPU 和内存正常,但 RT 突然毛刺严重。作为”懂底层”的数据开发,你会优先敲哪几条 Linux 命令排查系统层面的隐患?
💬 原始回答(候选人)
除了 CPU、内存,还需关注 IO 和网络。使用
iostat查看磁盘利用率和时延;使用sar查看网络统计,确认是否存在网络抖动。另外,服务器通常有定时脚本记录系统负荷,也可检查系统 message 日志看有无异常打印。
👨💼 面试官即时点评
命令方向正确,但未深入现象-原因对应关系。后续追问了
iostat -x中%util高但r/s低、await飙升的场景,以及vmstat中高cs的含义,候选人未回应。
🚀 改进建议与期望答案
完整排查链路(USE 方法论):
- 查看系统整体状态(
top、vmstat 1) - 关注
cs(上下文切换)是否过高(> 20万/秒),可能暗示 JVM GC 线程数过多或锁竞争。 -
查看
si/so(交换分区使用),若 >0 则内存不足。 -
深度磁盘分析(
iostat -x 1) - 若
%util ≈ 100%,但r/s + w/s低,await很高 → 大概率是磁盘硬件问题(如 SSD 坏块、RAID 写缓存失效)。 - 立即用
smartctl -a /dev/sda检查Reallocated_Sector_Ct和UDMA_CRC_Error。 -
软件层面:检查 ES 的
refresh_interval(若为 1s,改为 30s)和index.merge.scheduler.max_thread_count(限制为 1~2)。 -
网络抖动(
sar -n DEV 1看丢包/重传,ping检测延迟) -
进程级追踪:使用
pidstat -d 1查看具体进程的 IO 状况,结合 ES 的 GC 日志和线程池拒绝率(JMX)。 -
历史回溯:查看
/var/log/messages和dmesg是否有内核错误。
点评:底层能力是候选人的独特标签,建议将排查套路固化为”命令组合拳”,并熟悉常见性能工具的指标含义(如
%util与await的组合判断)。
问题 6:系统设计——实时评测系统
📌 面试官提问
将 Badcase 评测底座升级为实时系统:每个搜索请求毫秒级内由大模型打分,存入 OLAP 供监控。如何解决大模型推理速度跟不上高并发 QPS 的矛盾?
💬 原始回答(候选人)
坦诚表示”感觉搞不定”,因为大模型本身返回有瓶颈,无法毫秒级返回。当前自适应搜索通过去重(按搜索词+榜单方案)减少重复请求,但对模型本身延迟暂无更好办法,只能靠调参或模型优化。
👨💼 面试官即时点评
诚实面对物理极限值得肯定,但面试官期望的是架构取舍,而非强行实现毫秒级 LLM。考察重点是”如何在约束下设计近实时评测链路”。
🚀 改进建议与期望答案(架构方案)
核心思想:采样 + 级联模型 + 离线纠偏
- 分层采样(Flink)
- 根据搜索词热度动态调整采样率(高频 5%,中频 20%,长尾 0.5%)。使用 Count-Min Sketch 维护热词统计,内存消耗低。
-
采样后的请求异步发送给大模型,不阻塞主流程。
-
级联模型
- 先经过轻量级模型(如 MiniLM,延迟 < 5ms)输出相关性得分。
-
仅当得分在边界区域(0.4~0.6)或高热度词低得分时,才触发 DeepSeek 精细诊断(异步回调)。
-
缓存与去重
- 对同一 (query, 榜单方案) 在窗口期(如 5 分钟)内的结果直接复用(Caffeine 本地 + Redis)。
-
维护特征哈希,仅当应用列表变化时才重新评测。
-
旁路全量日志(数据一致性兜底)
- 所有请求 100% 落盘至 Hudi/Iceberg 湖仓。
- 每日凌晨运行离线大模型,对昨日全量(或更全面抽样)重打分。
-
比较离线结果与在线小模型结果,计算误判率;若假阴性 > 5%,则自动提升次日的在线采样率或调整小模型阈值。
-
监控与告警
- 建立”采样覆盖率”、”模型一致性”等指标,确保实时看板在可接受误差范围内反映趋势。
点评:这道题考察的是”在物理限制下构建可观测、可迭代的系统”,而不是追求不可能的实时性。候选人应多思考”近似正确”与”事后纠偏”的结合。
整体评价与学习方向
✅ 优势
- 工程落地意识强:异步解耦、重试降级、人工确认等策略非常务实。
- 业务敏感度高:能通过数据波动定位业务事件并推动优化。
- 底层运维基础好:Linux 命令、系统排查方向正确。
- 诚实开放:对不熟悉的领域坦然承认,学习意愿强。
🔧 待提升点
- 大数据调优:需系统掌握 Spark AQE、加盐两阶段聚合、Join 策略等经典解法。
- 架构取舍:在资源受限场景下,应主动提出”采样、级联、离线兜底”等折中方案,而非止步于”做不到”。
- 底层深度:将 Linux 排查套路固化为方法论(USE 模型),并熟记常见性能工具的输出解读。
- 元数据管理:补充事件监听、血缘自动更新的设计经验。
📚 推荐学习资源
- Spark:官方文档《Adaptive Query Execution》+ 《Tuning Spark》
- Linux 性能:书籍《性能之巅》(Brendan Gregg),重点 USE 方法论
- LLM 工程化:关注”级联模型”、”旁路离线计算”的业界案例
- 系统设计:多练习”近实时 + 高并发 + 模型瓶颈”类题目,培养折中思维
还没有评论,来第一个吧