尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

网易2023校招大数据开发笔试复盘:考点解析与实战技巧

网易2023校招大数据开发笔试复盘:考点解析与实战技巧 博主整理了网易2023校招笔试“大数据开发工程师正式第一批”的完整复盘。全文从真题考点、核心原理、代码实现到踩坑技巧全部按可直接复用的标准来写方便正在备战大数据校招或刚入行的朋友参考。1. 笔试整体设计与思路拆解1.1 这场笔试到底想筛什么样的人网易的笔试向来不是单纯考“背答案”大数据开发工程师这个岗位尤其明显它需要的人不只是会写SQL或者调参而是能在大规模数据链路里定位问题、做架构取舍、保证数据质量和时效性的工程师。我参加的是2023届正式批第一批整体感受是题目覆盖面广、深度适中、但特别看重你有没有真实做过项目。如果只刷过面试题没跑过集群很多细节题会直接暴露。从筛选逻辑来看这场笔试想确认三件事第一你对大数据生态核心组件Hadoop、Spark、Flink、Kafka、Hive等有没有体系化认知而不是零散地看过几篇博客第二你有没有真正动手处理过数据比如写没写过UDF、做没做过数据倾斜优化、懂不懂如何保证exactly-once第三你的工程思维是否合格比如遇到延迟增高怎么排查、离线任务和实时任务怎么选型、如何设计一套稳定又容易维护的数仓分层。这些都是日常干活逃不开的问题笔试只是换了个形式考察而已。1.2 考点分布与各模块权重大致估算从题型上看网易这套笔试卷主要分四个模块计算机基础与编程能力、大数据组件原理、数据仓库与建模、场景设计与代码题。前两个模块占比大约四成后面两个是重头戏。具体到知识点Hadoop生态的HDFS读写流程、MapReduce Shuffle阶段是常客Spark的RDD与DataSource API区别、Stage划分原理、内存管理经常出现Flink的检查点机制、状态后端、背压处理也反复考Kafka的消息一致性、分区策略和Kafka与Pulsar对比也出现在选择题里。数据仓库部分偏向实际落地比如维度建模的星型模型和雪花模型区别、拉链表怎么设计、缓慢变化维如何处理还有离线数仓和实时数仓的架构对比。代码题则比较直接一般是一道SQL窗口函数和复杂join加一道编程题用Java或Scala实现某个数据处理逻辑偶尔会出现让你手写一个简易版的WordCount或去重逻辑。我把自己参加的那场笔试的题目结构按记忆整理成了下面这个表供参考模块主要考点题量难度感受计算机基础与编程Java基础、并发、Linux命令约12题中等靠积累大数据组件原理HDFS、MapReduce、Spark、Flink、Kafka约18题偏深需理解原理数仓与建模维度建模、分层架构、实时数仓约8题中等偏上场景设计与手写题业务指标设计、SQL、编程题约3题拉开差距的关键这里要提醒一句网易的笔试时间比较紧凑我记得好像是90分钟做完全部题目而且题目之间切换后不能再回头修改答案所以节奏把控非常重要。我身边有同学在一道Flink状态后端的选择题上纠结太久结果后面的SQL大题没写完非常可惜。2. 核心知识点解析与实操要点2.1 HDFS与MapReduce不能只会“背读写流程”HDFS的读写流程几乎是必考题但网易的考法往往不会直接问你“写流程有几步”而是给一个具体的异常场景比如DataNode宕机后客户端会怎么处理、副本因子改成2之后可用性如何变化。这要求你不能只会背流程还得理解副本放置策略背后的目的以及心跳机制和故障恢复的时间窗口。我当时遇到的一道题是某个DataNode节点突然断连NameNode多久才会把这个节点标记为不可用以及正在写入的文件块会发生什么。这其实考的是两个概念一个是NameNode对DataNode的心跳超时判断默认10分钟但实际配置中有超时时间计算公式另一个是流水线写入时如果某个DataNode失败客户端会把未确认的数据包重新写入其他节点。如果你没有手动配置过dfs.namenode.heartbeat.recheck-interval这类参数大概率会答错。MapReduce的Shuffle阶段也是高频高点而且网易喜欢把Map端Shuffle和Reduce端Shuffle混在一道多选题里让你判断哪些操作发生在哪个阶段。这里有一个容易漏掉的知识点Map端Shuffle时数据会先写入环形缓冲区默认100MB达到阈值默认80%后才会溢写到磁盘溢写时会做分区排序如果配置了Combiner还会在溢写前做一次局部聚合。这个过程涉及的参数有好几个我在备考时专门整理过一份参数速查表考场上遇到这类题基本能秒选。2.2 Spark内存管理与作业调度理解比API更重要Spark的题目明显比Hadoop更看重理解深度。我印象最深的一道题是关于Spark 3.0之后统一内存管理的Executor内存分为Reserved Memory、User Memory、Spark Memory其中Spark Memory又分为Storage Memory和Execution Memory两者可以互相借用但Execution Memory被占用的部分只有在任务真正需要时才能强制回收Storage Memory。这道题考的不是简单的比例而是问你在什么情况下为什么Execution Memory可以抢占Storage Memory本质上是考你对Spark内存模型设计意图的理解。另一个容易被忽视的考点是Spark的Job、Stage、Task划分。网易出一道题一个Spark应用程序中textFile之后跟了一个map、一个reduceByKey、再跟一个join问你最后会生成几个Stage。很多人想当然地以为所有宽依赖都会切分Stage知道Shuffle依赖会导致Stage切割但容易忽略textFile本身会依据HDFS分区数决定初始分区数以及join操作可能会因为分区器不同引发额外的Shuffle。实际划分时建议按“宽依赖切Stage”的原则从后往前推先找到触发Shuffle的操作再看每个操作父RDD中的窄依赖链条。平时练习时可以自己用toDebugString打印执行计划验证笔试时这种题就稳了。2.3 Flink核心机制Exactly-once不是背出来的概念Flink在网易这种互联网公司的实时计算体系里用得非常多笔试自然也少不了。但是网易不太会直接问“什么是检查点”而是会问你“Checkpoint和Savepoint的区别”“状态后端存到RocksDB后如何保证增量检查点”“两次检查点失败后作业会不会自动恢复”。这些题目如果不了解实际运维场景是答不出来的。我记得有个选择题是关于端到端的一致性的选项涉及Kafka Source、Flink任务、Kafka Sink怎么配合才能实现端到端Exactly-once。这里其实考的是两阶段提交协议Flink的Kafka Producer会预提交事务等Checkpoint完成后再真正提交事务同时Kafka Consumer需要把读取位置也存到状态里。这个过程中如果Sink不支持事务端到端一致性只能降到At-least-once但如果你用了事务API并配置了isolation.levelread_committed才能真正保证下游读不到未提交的数据。类似题目特别容易在“Flink自己是否保证”和“端到端是否保证”之间设陷阱答题时一定要分清描述对象。背反压也是个经典考点。网易有一道题是“Flink任务出现反压你会怎么排查”选项里混杂着看Kafka消费Lag、看TaskManager的CPU、看网络吞吐、调整并行度等。正确的思路是先定位反压传播到哪个算子再看该算子的输入队列是否堆积最后分析根因是处理能力不足还是下游Sink写太慢。如果直接调并行度可能暂时掩盖问题但要是因为外部存储瓶颈导致的反压加并行度反而没意义还可能加剧负载。2.4 Kafka与消息队列一致性、分区与性能的取舍Kafka在大数据链路里几乎是标配笔试考得也很细。常见的有三类一是生产者端比如acks参数从0到-1对可靠性影响enable.idempotence为什么能去重以及如何调优批量大小batch.size和linger.ms来提升吞吐二是消费者端比如enable.auto.commit设置为false后如何手动提交位移分区数变更后消费者组会怎么重新分配三是Kafka与Kafka Connect、Schema Registry的配合比如值带有Avro Schema时消费端如何兼容新增字段。我遇到的一道题比较有意思给了你一个业务场景订单数据需要实时同步到数仓和推荐系统推荐系统可以接受秒级延迟数仓希望不丢数据问你该怎么设置Topic的分区数、副本数和生产者参数。这题其实没有唯一答案但核心原则是分区数要兼顾吞吐和下游消费并行度副本数至少2或3以防Broker宕机丢数据而生产者acks设置为all才能保证不丢消息。如果追求高吞吐可以把linger.ms调大一点例如5到10毫秒用少量延迟换更多批量发送这个trade-off在面试和笔试里都很常见。2.5 数据仓库建模与分层设计网易非常看重数仓建模能力这可能和公司内部数据团队一贯强调的“数据即资产”理念有关。题型包括选择题问维度建模中的事实表类型事务事实表、周期快照事实表、累积快照事实表分别适合哪些业务场景简答题让你为一个电商业务设计交易订单的星型模型要求说明事实表和维表字段还有让写一条拉链表SQL的并解释为什么要用拉链表而不是全量快照表。拉链表这个考点我建议认真准备因为网易几乎每年都有。拉链表的核心是保留每条记录的生命周期用start_date和end_date两个字段标识有效区间优点是在保留历史变化的同时大大减少了存储量。笔试里一般会让你基于当天增量数据更新历史记录的end_date再插入新的记录。实现上通常有两条SQL思路一条是union all加left join另一条是利用窗口函数取上一版本的时间。如果对拉链表的实现不熟很容易在更新历史区间时把数据搞重复笔试现场没有调试环境就只能靠平时多练了。3. 实操过程与核心环节实现3.1 笔试题型还原与参考解法这段我会把笔试中比较有代表性的题目按“题面—思路—解法”的方式还原出来虽然题目细节来自回忆和常见版本但核心考点和解题思路是可以参考的。SQL题高频考法连续登录与留存率网易特别喜欢考“连续登录N天用户数”“次日/7日留存率”这类问题算是一个基础门槛。我遇到的题大概是给定用户登录日志表user_id、login_date统计每个用户连续登录的最大天数。我给出的思路是用日期减去行号分组做连续区间判断。具体SQL如下SELECT user_id, max(consecutive_days) AS max_consecutive_days FROM ( SELECT user_id, grp, count(*) AS consecutive_days FROM ( SELECT user_id, login_date, date_sub(login_date, row_number() OVER (PARTITION BY user_id ORDER BY login_date)) AS grp FROM ( SELECT user_id, login_date FROM login_log GROUP BY user_id, login_date ) t1 ) t2 GROUP BY user_id, grp ) t3 GROUP BY user_id这里有一个关键点由于一张表里用户同一天可能有多条登录记录所以最内层先用GROUP BY user_id, login_date去重。如果不做去重直接算row_number()会把同一天的记录也当成不同行导致连续区间判断错乱。这个问题在笔试里很隐蔽因为选择题可能会故意不给你去重步骤直接让你判断结果。如果有人让你继续求“连续登录3天以上的用户数”你可以把外层GROUP BY user_id改成HAVING max_consecutive_days 3或者在上面的子查询里直接对consecutive_days加过滤条件。这种扩展问题也是网易喜欢的考法因为一道基础题可以衍生出很多变体考察你的灵活度。编程题高频考法模拟TopN或去重编程题在网易笔试里一般是选做或者必做我遇到的是用Java写一个从文件中统计单词出现次数并取TopN的程序。这道题看起来很像WordCount但考察重点在于(1) 能不能正确选择数据结构(2) 打不进内存的数据怎么办(3) 取TopN时用小顶堆还是大顶堆。参考写法如下import java.io.BufferedReader; import java.io.FileReader; import java.util.*; public class TopNWords { public static void main(String[] args) throws Exception { String path args[0]; int n Integer.parseInt(args[1]); MapString, Integer counter new HashMap(); try (BufferedReader br new BufferedReader(new FileReader(path))) { String line; while ((line br.readLine()) ! null) { String[] words line.trim().split(\\s); for (String w : words) { if (!w.isEmpty()) { counter.put(w, counter.getOrDefault(w, 0) 1); } } } } // 用大小为 n 的小顶堆保留出现次数最大的 n 个单词 PriorityQueueMap.EntryString, Integer heap new PriorityQueue(Comparator.comparingInt(Map.Entry::getValue)); for (Map.EntryString, Integer e : counter.entrySet()) { heap.offer(e); if (heap.size() n) { heap.poll(); } } ListMap.EntryString, Integer result new ArrayList(heap); result.sort((a, b) - b.getValue().compareTo(a.getValue())); for (Map.EntryString, Integer e : result) { System.out.println(e.getKey() : e.getValue()); } } }这里有一个要注意的点小顶堆保留的是最大的N个每次堆大小超过N就弹出最小值这样堆里剩下的就是全局最大的N个。如果用大顶堆就需要把所有元素都入堆再弹出N次复杂度反而多了一个N倍内存和堆调整的消耗笔试时可能被追问为什么不用大顶堆回答关键就是“内存占用更小时间复杂度也更稳定”。另一个隐藏考点是内存假设。如果文件特别大放进一个HashMap可能内存溢出这时候应该用什么方案常见回答是分片处理把文件按单词哈希取模拆成多个小文件分别统计再合并。这个思路在笔试里并不需要写完整代码但如果你能在代码注释里写一句“大文件场景可将单词哈希到分桶文件再分别聚合”面试官会觉得你有工程意识。3.2 场景设计与架构题参考思路网易笔试的场景题通常不会要求你写出完整实现但会让你补全架构设计的关键环节。我印象比较深的一道题是“订单系统数据实时性要求高又要支持小时级的BI报表你会怎么设计数据链路”这道题常规解法是Lambda架构也就是实时链路和离线链路并存。实时链路用Canal监听MySQL的binlog写入KafkaFlink消费后清洗、关联维表最终写入Doris或ClickHouse供在线报表查询离线链路则是把Kafka的数据通过DataX或Spark定期同步到Hive再走离线数仓ETL生成T1报表。两个链路的数据口径必须一致所以要在源头统一编码规范、统一字段含义并且在DWS层做合并校验。很容易被忽略的一个点是维表更新如何同步。比如订单表关联用户维表用户维表在MySQL里是实时更新的而Flink任务需要关联最新的用户等级或地域信息如果直接把维表加载到内存更新会有延迟。更常见的方法是维表存Redis或MySQLFlink使用Lookup Join实时查询同时配合本地缓存降低压力。这部分的取舍在笔试里可以写出来会让面试官看到你不是只停留在“搭链路”的层面而是考虑到了数据一致性和性能的平衡。如果被问到“Kafka到数仓延迟怎么保障”我会分两点答一是Kafka的Topic分区数要结合下游消费能力设置不要盲目设大二是Flink任务要开Checkpoint同时给Kafka Consumer配置合理的max.poll.records避免频繁rebalance导致消费停滞。在笔试里把这个话题引到“消费延迟的监控和恢复”上就能展现你对线上稳定性有概念。3.3 笔试做题节奏与时间分配建议网易笔试的时间很紧凑我自己的经验是先花3到5分钟扫一遍全部题目把确定性高的选择题快速做掉标记出难题和需要写SQL的大题。保证简单题100%正确率比死磕难题更重要因为大厂笔试通常是按比例刷人你拿到的总分够高才能进面而不是只要求满分。我推荐的时间分配是前30分钟做选择填空尽量控制在每题1分钟左右超过1分半就标记跳过中间30分钟做SQL题和场景设计题这类题分值高但不需要追求完美版本先把核心语法写对最后30分钟做编程题和检查。如果SQL题卡住了可以先写伪代码思路因为有些平台的评分标准里思路步骤也会给少量分而不是只有跑通用例才得分。考场上最可惜的情况是明明会做某道相关的题但因为前面选择题纠结太久导致后面SQL只导出了表结构没写完整。所以一定要控制每题时间遇到拿不准的选项先用排除法缩小范围选一个最合理的然后在标记里记录题号有时间再回来看。如果平台不允许回看那就更要狠下心做决策别指望“最后再改”。4. 常见问题与排查技巧实录4.1 笔试前必须要避开的几个坑我第一批笔试前也踩过一些坑写出来给大家避雷。第一没有验证本地运行环境。网易笔试的在线编辑器一般支持Java、C、Python但如果你用Scala有些平台不一定支持。我建议提前进模拟环境试一下代码格式、标准输入输出怎么读以及是否允许自定义包名。很多人习惯用自己的IDE缩进风格一旦在线编辑器严格按空格校验可能会浪费时间去调格式。第二SQL方言不统一。笔试平台的SQL引擎往往是Hive或Spark SQL但有些平台支持MySQL语法。比如在Hive SQL里TIMESTAMPDIFF函数不可用需要使用datediff再比如rownum在Hive里是敏感的不要用。平时练习时尽量统一用Hive SQL的语法这样大厂笔试中遇到的兼容性问题会少很多。第三只刷题没实操。网易的题目很少直接问“HDFS写流程第一步是什么”而是通过异常场景来考察你有没有真正操作过集群。如果你只刷题不实操对“节点下线时副本怎么恢复”这类问题会感觉很虚。我自己的经验是哪怕用本地虚拟机搭一个一主两从的Hadoop集群跑通一次MapReduce再模拟kill掉一个DataNode观察恢复过程比刷十道相关选择题都管用。第四忽略了UDF和内置函数细节。网易笔试里很可能出现“写一个UDF实现JSON解析并提取字段”的问题。此时如果你不清楚get_json_object的语法或者不知道在Spark 3.0里推荐用from_json函数加Schema代码就会写得很别扭。建议考前系统梳理一下常用内置函数特别是字符串处理、时间处理、JSON解析这三类。4.2 考场上容易犯的低级错误低级的丢分点往往不在于知识点不会而在于审题不清。比如有些选择题问的是“哪一个选项是错误的”结果你看得太快选成了“正确”的选项。这种失分很冤枉而且几乎每次考试都有。建议大家做选择题时先把题目关键词圈出来“错误”“不属于”“不可能”这些字眼用眼睛扫过是不够的最好在读选项前在心里默念一遍。再比如编程题里的输入输出格式。网易的在线判读系统通常要求读标准输入输出标准输出如果你在代码里写了读取本地文件或者打印了多余的提示信息判题会直接判错。笔试前做几道完整的在线判题练习熟悉不同题型的输入格式是很有必要的。还有一个很容易被忽略的点SQL题里要求“按某字段排序”但你没指定升序还是降序导致部分用例通过不了。一般默认ORDER BY是升序但题目如果明确说“取最活跃的前10名”就得用ORDER BY cnt DESC LIMIT 10。这类小细节看起来简单却经常让认真准备的考生翻车。4.3 平时怎么练才能稳过笔试如果你现在离笔试还有两三周时间我建议按以下路径复习先花一周把核心组件原理过一遍重点放在HDFS读写、MapReduce Shuffle、Spark Stage划分、Flink Checkpoint和Kafka消费模型上然后花三到四天刷SQL题尤其是窗口函数、连续登录、留存率、行列转换这些高频题型最后每天做一两道编程题限制自己在30分钟内完成模拟真实考场节奏。这里可以推荐几个练习方向不是打广告就是常见的学习路径LeetCode的Top100高频题可以练手但大数据的编程题更偏向文件处理、排序聚合、TopN、去重和模拟题所以牛客网的大数据真题和在线编程题更有针对性。SQL方面牛客SQL题库和LeetCode的数据库题库都可以刷但不要把时间花在特别偏的题上重点还是围绕窗口函数和复杂join。至于Hadoop和Spark原理直接看官方文档的“核心概念”章节比看二手博客更有用因为官方文档会讲清楚设计动机和参数假设。我个人体会最深的一点是练题时一定要“边写边讲”。如果你能在脑子里把这道题涉及的原理讲清楚比如为什么要用窗口函数而不是group by为什么Shuffle会产生磁盘IO那你对知识点的理解才算到位。笔试这个环节考的就是你能否在有限时间内稳定输出这些知识提前把逻辑理清楚考场上自然就不慌了。4.4 笔试后的复盘与下一步衔接建议笔试结束不代表整个流程结束。我一般会在笔试结束后尽快复盘把所有能回忆起来的题目和我的答案记下来对照知识点查漏补缺。这样有个好处如果几天后收到了面试通知你还可以趁热打铁把这些考点转换成面试可能追问的问题。比如笔试里考了Flink Checkpoint面试官大概率会问“你实际项目里Checkpoint间隔怎么设置失败恢复时有没有遇到过状态不一致的情况”你在笔试后准备过这些点回答起来就会顺畅很多。还有一个建议就是提前想好项目经历怎么和数据链路结合。网易的大数据开发面试中项目经历几乎是必问的。如果你有一个离线数仓项目想一想指标口径是怎么定义的、ETL调度用的什么、数据质量怎么监控如果你有实时计算项目想一想怎么处理迟到数据、用什么状态后端、如何做维表关联。笔试里考的那些理论最终还是要落到项目实处所以从准备笔试开始就应该有意识地把各个组件知识点放到项目场景里串联。另外数据科学与大数据技术专业的学生在校招里容易有一个误区把大量时间花在算法题上反而忽略了数据组件本身。但大数据开发工程师笔试更看重的是组件原理和实战能力算法题能写基础版本就行。我认识的一些顺利拿到offer的同学普遍做法都是先把Hadoop、Spark、Flink这几套核心组件的原理吃透再用真实业务场景来练习SQL和代码最后才是补算法题。方向比速度重要提前想清楚岗位侧重点复习效率能高很多。
返回列表