
别人在刷题我在巨人肩膀上踩坑——猿辅导大数据校招1面2面全记录大三下学期开始投大数据方向的校招投了大概三十多家猿辅导是第一个给我面试机会的。既然标题写的是1面2面面经那就把两轮面试的完整过程、面试官问的问题、我当时的回答思路、以及事后复盘发现的坑一次性都写清楚。这篇东西不仅能当面试题参考更想让你看到大数据校招面试到底在考什么面试官手里的评分表大概长什么样以及哪些细节是自己在学校根本练不到的。我在学校做过的东西不算多一个基于Spark的用户行为分析项目一个Flink实时统计的小Demo参加过MathorCup大数据竞赛拿了省奖Hadoop生态的组件用过HDFS、Hive、Spark、Flink、Kafka这些。面试之前刷了两周面经把高频题过了一遍以为自己准备得差不多了结果一面还是被问懵了好几次。这篇文章会把两轮面试拆开讲每道题都会给到我的回答方式和面试官想要的答案方向最后再说说复盘时发现的两个致命问题。1. 面试前准备与简历复盘1.1 猿辅导大数据岗位的画像分析先说说猿辅导这个岗位的特点。猿辅导的核心业务是在线教育有直播课、斑马AI课、题库产品用户量级在千万到亿级之间。这个业务形态决定了它的大数据团队日常要处理的事情非常具体直播课的实时在线数据、用户学习行为日志、答题数据的离线分析、推荐系统特征数据的产出。所以面试官关心的问题很清楚你懂不懂实时计算因为直播场景有大量实时需求你懂不懂海量日志的离线处理因为学习行为日志量非常大你懂不懂数据仓库的分层设计这是支撑报表和数据分析的基础最后还要看你的工程能力因为生产环境不是写完SQL就结束的。这个岗位画像和我之前准备的通用大数据八股文差距很大我本来以为会考很多源码级别的原理结果大部分时间都在讨论实际场景怎么设计、怎么选型、怎么处理数据倾斜这类问题。1.2 简历上每一个字都要能展开讲我这块吃过亏一定要先说。我的简历写了精通Spark面试官第一面就问了一个非常刁钻的问题后面会详细说。面试前一定要做的事情是把简历上每一条技能、每个项目、每个技术名词都准备一个深度拓展版本。比如写了熟悉Kafka那至少要准备以下问题Kafka为什么快分区策略有哪些消费者组是怎么管理的如何保证消息不丢失不重复Kafka和Pulsar的对比Kafka在你们项目里负责什么。我把简历里的项目都重新过了一遍重点做了三件事一是把项目的数据量级、集群规模、业务背景重新梳理清楚二是把项目里用到的每个组件都准备好为什么选它而不是另一个的回答三是把项目里遇到的技术难点和解决方案逐条写出来确保面试官无论从哪个角度深挖都能接得住。项目复盘还有一个技巧不要只准备自己做了什么要准备如果重新做一次哪里会改。这个问题我两轮面试都被问到了都是加分的好机会因为能展示你对技术方案的深入思考而不是单纯的执行者。2. 猿辅导大数据一面技术面实录2.1 自我介绍和项目深挖一面面试官是个看起来三十岁出头的工程师开场就让我自我介绍。这里我建议不要说太多个人爱好之类的话两分钟左右讲清楚三件事就行我是谁、我会什么技术栈、做过什么有代表性的项目。重点是让面试官快速找到可以追问的点。我自我介绍说完做过Spark用户行为分析项目之后面试官马上开始深挖。他问了大概二十多分钟的项目细节包括数据量有多大、集群多少台机器、数据从哪来、清洗逻辑怎么写的、用Spark的哪些算子比较多、遇到数据倾斜怎么处理的、有没有做过性能调优。这里重点说一下数据倾斜的问题因为这是大数据面试最高频的问题而且非常能体现候选人有没有真实做项目的经验。面试官问我你的项目里如果某个热门商品的PV量特别大导致某个reduce处理时间特别长你会怎么解决我当时回答的思路是先定位是不是数据倾斜再看倾斜的Key是什么然后对症下药。我的项目里用过的方法有加盐随机打散、两阶段聚合、过滤异常值、增大Shuffle分区数。面试官继续追问加盐两阶段聚合如果业务上必须把同一个用户的数据聚合在一起怎么办我回答用自定义分区器把特定用户的Key单独分到一个分区然后其他Key正常处理。这个思路面试官比较认可因为说明我不仅知道通用解法还知道业务约束下怎么调整。2.2 Java基础和JVM问题一面内容比我想象的宽Java基础问了不少。猿辅导的技术栈是Java为主大数据组件虽然很多是Scala写的但业务代码基本都是Java所以Java基础是必须扎实的。面试官问了几道比较典型的题HashMap在JDK7和JDK8的区别ConcurrentHashMap的锁机制演进volatile和synchronized的区别Java内存模型里的可见性和有序性。我的回答策略是先给结论再讲原理最后举个例子。比如HashMap的问题先说JDK8引入红黑树优化了极端情况下的查询性能然后讲链表转红黑树的条件是链表长度超过8且数组长度超过64再补充为什么是8而不是其他数字——因为泊松分布下链表长度达到8的概率极低这是时间换空间的设计哲学。JVM的问题问的是GC Roots有哪些、你了解哪些垃圾收集器、CMS和G1有什么区别。我的项目里做过一次full GC导致的线上批量任务变慢所以这个场景讲得比较深入。我建议JVM的问题不要死记硬背一定要结合一个真实的调优案例来回答哪怕是自己写Demo复现的也比背八股文强得多。2.3 HDFS和Hive相关问题HDFS问了NameNode和SecondaryNameNode的工作机制以及HDFS写文件的过程中如果某台DataNode挂了会发生什么。这个问题我答得一般因为平时用HDFS比较多但底层机制确实没怎么细看。面试官没有追着打而是引导说你想想client先写第一个block然后写第二个block时节点挂了这时候client怎么感知我才想起来有ack机制和重试机制。这件事给我的教训很大面试准备不能只盯着SQL和算子底层原理一定要过一遍因为面试官会挑你最常用的组件往下挖。Hive问了表分区和分桶的区别以及HiveSQL的优化手段。分区分桶我讲得比较顺因为熟。HiveSQL优化我回答了几个点小文件合并、数据倾斜处理、MapJoin优化、谓词下推、列裁剪。面试官接着问我MapJoin什么时候会被Spark自动优化成Broadcast Join这个就涉及下游了我答了10MB的参数阈值但面试官说实际生产中这个阈值可能不够现在一般会手动调大或者用AQE的动态调整我当时没有听说过Spark 3.0的AQE可以动态调整Join策略确实卡住了。2.4 Spark和Flink核心问题Spark是问得最深的一块。面试官问了RDD和DataFrame的区别宽依赖和窄依赖Spark的Job执行流程Spark内存管理Spark的Shuffle机制。其中Shuffle问题我答得很细因为确实花了很多精力研究。我把Shuffle的整个过程讲了一遍Shuffle Write阶段每个ShuffleMapTask会把结果数据按照Partitioner写入内存缓冲区满了溢写磁盘会做排序和合并Shuffle Read阶段从各个MapTask拉取数据边拉边合并边聚合。面试官又追问了HashShuffle和SortShuffle的区别以及钨丝计划在Shuffle里做了什么这个我准备过回答得比较完整。Flink问的是Flink的Checkpoint机制怎么运作的两阶段提交怎么实现Flink和Spark Streaming的区别以及为什么做实时的时候选了Flink而不是Spark Streaming。Checkpoint这个问题我回答得很顺因为提前准备过Barrier对齐、状态快照、分布式快照的流程都讲了一遍。面试官问了一个需要动脑的问题如果某个算子处理速度很慢导致Barrier迟迟不能到达下一个算子会发生什么我回答会触发反压如果反压持续到Checkpoint超时就会导致Checkpoint失败。面试官点头后继续问超时时间能不能配置我答了默认10分钟可以配。总结就是Flink的问题回答得不错因为实时部分确实有认真研究过。2.5 算法题和场景设计题一面最后写了一道算法题LeetCode中等难度的最长无重复字符的子串用滑动窗口做。面试官在共享文档里发题目要求在白板上写思路然后写代码。我没有直接写先分析了一下时间复杂度和空间复杂度然后写了一个基于HashSet的滑动窗口方案写完后面试官问了两个问题如果字符串特别长怎么办能不能优化空间。第一个问题我的回答是如果内存放不下整个字符串可以分段处理保留上一段可能产生的最大窗口边界继续往后扫或者用流式滑窗的方式每次只维护窗口内的数据。第二个问题我说可以用数组代替HashSet因为字符的ASCII范围是固定的能O(1)判断是否重复且比HashSet省内存。面试官比较满意这道题算是我一面唯一的加分项。场景设计题是假设猿辅导每天晚上要出一份当天的学习报表数据量大概每天10亿条日志你设计一个离线数仓方案。我的回答框架是数据采集层用Flume或DataX收集日志到KafkaKafka做削峰填谷然后Flink做实时清洗清洗后的数据落到Kafka再进HDFSODS层存储原始数据DWD层做维度建模和清洗DWS层做汇总ADS层出报表结果。指标计算用Spark SQL的离线批处理来完成。面试官问了分区怎么设计我回答按天分区查询频率高的热表可以再按小时分区还要定期合并小文件。追问了如果凌晨2点报表就要出数据量大算不完怎么办我回答可以通过增量计算来做每天只算增量部分结果和历史聚合而不是每天全量重算。整体思路面试官没挑大毛病。3. 猿辅导大数据二面深入技术面实录3.1 整体面试形式一面结束大概过了一个星期收到二面通知。二面面试官比一面的更资深应该是Team Leader级别。问的问题更抽象、更底层、更偏架构设计对候选人综合素质要求很高。面试时长大约一小时没有写算法题全程聊技术和项目。二面的风格跟一面完全不同。一面更像是在划范围看看你技术栈的广度二面则在深挖逻辑看你有没有真正的理解而不是停留在API使用层面。建议准备二面的同学重点思考两个问题一是技术方案的取舍逻辑二是碰到没遇到过的问题时的思考路径。3.2 从一条业务需求聊到架构设计二面开场面试官给了我一个业务场景用户在直播课上的互动数据包括点赞、评论、上麦、下课现在要做实时大屏展示同时这个数据还要进数仓做离线分析。你从头设计一套方案。我第一反应是Flink实时计算 Kafka HDFS离线链路这个标准方案但面试官的要求显然不止这个。他开始连环追问数据从客户端过来是先走网关还是直接进Kafka你用什么格式传输如果某个环节挂了怎么保证不丢数据我开始意识到这种问题其实在考察端到端的数据链路设计能力。我逐步把方案补充得更完整客户端采集SDK上报到接入层接入层做校验和初步清洗然后写入KafkaKafka的Topic按业务类型拆分互动数据一个Topic行为日志一个TopicFlink消费实时数据做指标计算同时把原始数据落一份到HDFS。为了保证不丢数据接入层写入Kafka后要确认Flink消费要开启Checkpoint下游存储要支持幂等写入。面试官又问了如果Kafka集群挂了怎么办我回答Kafka本身用副本机制保证高可用生产环境配置3副本配合acksall确保消息不丢。面试官继续问如果整个机房断电了数据怎么恢复这个问题我准备过回答是依赖Kafka在断电前刷盘的数据以及HDFS上已有的数据文件进行恢复同时接入层客户端在发送失败的时候要有本地缓冲和重试机制。3.3 实时计算的技术细节追问二面的关键词是追问到底。每个回答后面都跟了至少两三个更深入的问题。我印象最深的是关于Flink两阶段提交的讨论面试官问得非常细。面试官先问你刚才说Flink的Sink是幂等写入那Kafka Producer的事务是怎么实现的我从Kafka的幂等Producer开始答讲到事务性API的初始化、beginTransaction、commitTransaction调用过程。面试官追问事务性API需要一个Timeout配置如果设置太短或者太长分别会有什么影响我回答如果太短可能出现事务超时被Kafka强制中止但Flink还不知道的情况如果太长事务日志会占很多内存事务数量大时会拖垮性能。然后我又补充了怎么设置transaction.timeout.ms与Kafka broker的transaction.max.timeout.ms之间的关系。接下来他问了一个二面特别有区分度的问题Flink做窗口统计时候如果窗口内数据特别多你会怎么优化我按实际项目经验分了几层回答第一如果是计算密集考虑Flink的增量聚合比如reduce和aggregate不要用全量聚合第二如果是状态太大考虑开启State TTL清理过期状态或者用RocksDB状态后端第三如果是某个Key太热可以做局部预聚合比如分层聚合第四如果数据实在太多考虑窗口大小和业务需求是否真的匹配能否用滚动窗口替代滑动窗口减少重叠计算。面试官听完后说思路可以这是二面让我最放松的一个瞬间。3.4 数据质量保障和数据治理这场面试还有一个非常务实的环节聊了半小时数据质量。面试官说做数据的人最基本的素养是保证数据质量。如果你的实时报表数据跟离线报表数据对不上你怎么排查这个问题挺难的因为它没有标准答案。我答的排查思路大概是先对比数据总量是否一致再对比关键指标比如UV和PV是否一致如果总量对不上可能是实时链路的清洗规则和离线链路的清洗规则不一致如果实时数据多了可能是消费重复或者窗口计算重复如果实时数据少了可能是数据丢失因为Checkpoint恢复之后漏了数据然后还要对比时间口径比如实时用的是事件时间还是处理时间离线任务的窗口切割是否一致。最后我补充了一句最根本的解决办法是同一份数据源、同一套计算逻辑尽量把规则收敛到一处。面试官没有评价我的回答继续追问如果实时和离线的数据差异一直存在但业务方又特别急着要数据你怎么办我当时的回答是先出一个数据质量评估报告列出差异可能影响哪些指标、影响多大让业务方和技术团队共同确认哪些表可以先用哪些表暂时不能上同时快速定位原因修复。面试官说这个思路对生产环境经常是带着风险上线的。这个回答也给一个启示数据工程师不止是写代码还要会判断优先级、会沟通。3.5 数仓分层设计和建模二面还专门聊了数仓。面试官问的是假设你要搭建猿辅导的离线数仓你会怎么分层每层的职责是什么这个我答得比较标准按经典的数仓分层回答ODS层存原始日志DWD层做清洗去重和维度退化DWS层做公共汇总ADS层面向业务应用。面试官追问了一个细节ODS层和DWD层之间怎么做数据校验我回答了行数校验、主键唯一性校验、关键字段空值率校验、分区数据完整性校验、源表和目标表的对账。他接着问一张ODS表有数据但DWD对应的表还没跑完报表又要依赖DWD你会怎么处理我回答依赖调度系统来控制比如有向无环图调度上游没跑完下游不启动。后面还问了一个关于数据建模的问题你了解维度建模吗星型模型和雪花模型有什么区别在什么场景下选哪种星型和雪花模型的区别我答了星型模型的维度表是冗余的查询性能好但数据会有冗余雪花模型维度表规范化数据冗余少但查询要关联更多层。场景选型上我回答OLAP场景优先用星型模型因为查询快、容易理解如果维度表特别大且维度属性变化不频繁可以考虑雪花模型减少存储。面试官没有追问太多算是平稳过关。3.6 系统设计和综合素质问题二面后半段面试官让我设计一个实时计算平台。他给的要求是平台上有多条实时任务机房有多个可用区任务发布和回滚要尽量不影响在线业务。我一听就知道这是要考察系统设计能力。我的设计思路是任务托管层用YARN或者K8s做资源调度Flink任务提交到集群跑平台负责SQL和Jar的发布管理。发布的时候先启动新任务实例确认新实例正常运行并消费了数据之后再切换流量然后把旧任务停掉这种发布方式叫蓝绿发布。回滚的时候直接把还存留的旧版本任务实例拉起来再把流量切回来就行。面试官追问新任务实例启动到切换流量的过程中这条数据是否会丢,我回答通过Kafka的消费者组来实现同一个group.id的任务实例一起消费Topic新的任务实例在同一个消费者组里启动后Kafka重平衡会把部分分区分配给它新实例从最近提交的offset开始消费旧的实例会释放分区这个过程本身不会丢数据但可能会有短暂重复。面试官又问重复数据怎么处理我回答下游计算要做去重幂等写入比如结果表用主键冲突更新。这个回答基本结束了系统设计部分。最后二面试官问了一个让我印象很深的问题如果有个计算任务需要每天凌晨跑但每天都会因为各种原因跑不完别人一直来找你你的处理思路是什么我不太确定这是不是考察沟通或项目管理能力但我的回答是先看有没有硬性瓶颈比如数据量增长导致的资源不够如果能加资源就加资源如果是计算链路本身有性能问题就优化任务如果是调度依赖太多可以做链路瘦身。如果以上都做完了还跑不完就要和业务方商量是不是可以延迟数据的产出时间或者把部分数据改成T1延迟出。反正总的原则是能技术解决的优先技术解决技术解决不了的要及时同步并协调业务预期而不是自己硬扛着。面试官点头说这个态度是对的。4. 面试后的复盘总结与经验教训4.1 复盘思路到底哪些地方丢了分两轮面完我自我感觉还行但最后没有进入HR面。复盘的时候想明白了一个关键原因一面二面技术问题答得都能接上但深度上不够职业化——就是那种在真实生产环境里踩过坑之后才有的回答方式跟我这种偏学院式的回答有明显差距。一面最大的问题是HDFS底层原理那题答得不好因为只顾着用没想过底层机制。二面最大的问题是架构设计环节面试官说让我设计实时计算平台的时候我的第一版方案只有一两个组件的拼装没有系统性地考虑到高可用、发布回滚、资源隔离这些生产环境核心要素。这两个问题一综合面试官心里的评估就是基础可以但生产经验有欠缺。对于校招来说这很致命因为大厂校招招的虽然是新人但希望新人能快速独立上手。4.2 给后来者的实用建议清单结合我的经历给准备大数据校招的同学几条实操建议每条都是踩过坑换来的。第一简历上写熟悉和精通之前先试着自己闭卷回答一遍面试官可能问的三个最这个技术最好的设计是什么最容易出问题的场景是什么最常用的调优手段是什么。如果答不上来就改简历措辞或者补课。第二别只看面经一定要自己动手搭一个完整的小项目。不要求集群多大关键是链路要全写一个模拟数据生成器日志写进KafkaSpark和Flink各写一个消费任务结果落到MySQL或者HDFS。面试官问我数据倾斜和Checkpoint的时候如果不是有实际操作打底很容易露馅因为这类问题光靠背题是没法灵活组织语言的。第三准备面试前要系统过一遍生产环境的救火场景。比如数据重复、数据丢了、任务变慢、数据对不上这类经典问题。回答的时候一定要带出你的排查路径而不仅仅是直接给答案。面试官喜欢听到的是我觉得问题可能在A下次排查A不是的话再排查B这种思路而不是一句话结论。第四算法题不要只刷Hot100大数据岗位经常会考滑动窗口、TopK、前缀和、哈希表以及一些并发编程和流处理相关的小题。猿辅导的一面算法题就是滑动窗口变种幸好之前刷过。第五面试最后面试官问你有什么问题想问时别问薪资和加班。问一个有深度的问题比如咱们的实时计算集群目前用的是Flink还是Spark Streaming未来有什么演进方向或者数仓这块有没有上数据湖的计划这种问题会让面试官觉得你有思考、有潜力。5. 写在最后的一点个人体会从投简历到收到拒信整个过程持续了大概三周。虽然结果不理想但回头看这两轮面试我获取的信息量比刷一个月面经还大。面试官追问的技术点很大程度上反映了生产环境对大数据工程师的真实要求不只懂API还要懂原理不只做开发还要处理数据质量不只完成任务还要考虑架构设计和故障恢复。如果你也在准备大数据校招我的建议很直接别死磕八股文多动手多复盘多在真实的数据场景里发现问题。你在大学里做的那些小项目可能在面试里撑不过三个追问。但如果你真的把一个项目从头到尾做完把每一个组件为什么这么选想清楚那你面试的时候眼里会有光的面试官能看出来。这两轮面试虽然没过但让我后续面试其他家的时候状态提升了一大截。面完猿辅导之后的一个月我又面了好几家拿到了两个Offer。回头看那一场失败的面试其实是最重要的一堂准备课。