模拟面试记录整理

面试岗位:后端开发工程师(大数据&大模型方向)
候选人背景: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 的 updateupsert 操作,仅更新单个文档,并控制 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)的兜底方案:

  1. 开启 Spark AQE 自动优化(Spark 3.0+):
    sql set spark.sql.adaptive.enabled=true; set spark.sql.adaptive.skewJoin.enabled=true; -- 自动检测并拆分倾斜分区

  2. 手动加盐两阶段聚合(通用解法):
    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),确保热键被充分分散。

  1. 调整 Spark 参数:
  2. spark.sql.shuffle.partitions 适当增大(如 400~800)
  3. 开启 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 方法论):

  1. 查看系统整体状态(topvmstat 1
  2. 关注 cs(上下文切换)是否过高(> 20万/秒),可能暗示 JVM GC 线程数过多或锁竞争。
  3. 查看 si/so(交换分区使用),若 >0 则内存不足。

  4. 深度磁盘分析(iostat -x 1

  5. %util ≈ 100%,但 r/s + w/s 低,await 很高 → 大概率是磁盘硬件问题(如 SSD 坏块、RAID 写缓存失效)。
  6. 立即用 smartctl -a /dev/sda 检查 Reallocated_Sector_CtUDMA_CRC_Error
  7. 软件层面:检查 ES 的 refresh_interval(若为 1s,改为 30s)和 index.merge.scheduler.max_thread_count(限制为 1~2)。

  8. 网络抖动sar -n DEV 1 看丢包/重传,ping 检测延迟)

  9. 进程级追踪:使用 pidstat -d 1 查看具体进程的 IO 状况,结合 ES 的 GC 日志和线程池拒绝率(JMX)。

  10. 历史回溯:查看 /var/log/messagesdmesg 是否有内核错误。

点评:底层能力是候选人的独特标签,建议将排查套路固化为”命令组合拳”,并熟悉常见性能工具的指标含义(如 %utilawait 的组合判断)。


问题 6:系统设计——实时评测系统

📌 面试官提问

将 Badcase 评测底座升级为实时系统:每个搜索请求毫秒级内由大模型打分,存入 OLAP 供监控。如何解决大模型推理速度跟不上高并发 QPS 的矛盾?


💬 原始回答(候选人)

坦诚表示”感觉搞不定”,因为大模型本身返回有瓶颈,无法毫秒级返回。当前自适应搜索通过去重(按搜索词+榜单方案)减少重复请求,但对模型本身延迟暂无更好办法,只能靠调参或模型优化。


👨‍💼 面试官即时点评

诚实面对物理极限值得肯定,但面试官期望的是架构取舍,而非强行实现毫秒级 LLM。考察重点是”如何在约束下设计近实时评测链路”。


🚀 改进建议与期望答案(架构方案)

核心思想:采样 + 级联模型 + 离线纠偏

  1. 分层采样(Flink)
  2. 根据搜索词热度动态调整采样率(高频 5%,中频 20%,长尾 0.5%)。使用 Count-Min Sketch 维护热词统计,内存消耗低。
  3. 采样后的请求异步发送给大模型,不阻塞主流程。

  4. 级联模型

  5. 先经过轻量级模型(如 MiniLM,延迟 < 5ms)输出相关性得分。
  6. 仅当得分在边界区域(0.4~0.6)或高热度词低得分时,才触发 DeepSeek 精细诊断(异步回调)。

  7. 缓存与去重

  8. 对同一 (query, 榜单方案) 在窗口期(如 5 分钟)内的结果直接复用(Caffeine 本地 + Redis)。
  9. 维护特征哈希,仅当应用列表变化时才重新评测。

  10. 旁路全量日志(数据一致性兜底)

  11. 所有请求 100% 落盘至 Hudi/Iceberg 湖仓。
  12. 每日凌晨运行离线大模型,对昨日全量(或更全面抽样)重打分。
  13. 比较离线结果与在线小模型结果,计算误判率;若假阴性 > 5%,则自动提升次日的在线采样率或调整小模型阈值。

  14. 监控与告警

  15. 建立”采样覆盖率”、”模型一致性”等指标,确保实时看板在可接受误差范围内反映趋势。

点评:这道题考察的是”在物理限制下构建可观测、可迭代的系统”,而不是追求不可能的实时性。候选人应多思考”近似正确”与”事后纠偏”的结合。


整体评价与学习方向

✅ 优势

  • 工程落地意识强:异步解耦、重试降级、人工确认等策略非常务实。
  • 业务敏感度高:能通过数据波动定位业务事件并推动优化。
  • 底层运维基础好:Linux 命令、系统排查方向正确。
  • 诚实开放:对不熟悉的领域坦然承认,学习意愿强。

🔧 待提升点

  • 大数据调优:需系统掌握 Spark AQE、加盐两阶段聚合、Join 策略等经典解法。
  • 架构取舍:在资源受限场景下,应主动提出”采样、级联、离线兜底”等折中方案,而非止步于”做不到”。
  • 底层深度:将 Linux 排查套路固化为方法论(USE 模型),并熟记常见性能工具的输出解读。
  • 元数据管理:补充事件监听、血缘自动更新的设计经验。

📚 推荐学习资源

  • Spark:官方文档《Adaptive Query Execution》+ 《Tuning Spark》
  • Linux 性能:书籍《性能之巅》(Brendan Gregg),重点 USE 方法论
  • LLM 工程化:关注”级联模型”、”旁路离线计算”的业界案例
  • 系统设计:多练习”近实时 + 高并发 + 模型瓶颈”类题目,培养折中思维