大数据校招笔试实战:Hadoop生态、SQL与数据倾斜解析
2026/8/29 9:26:20 网站建设 项目流程

2018年秋季那阵子,字节跳动的校招在大数据方向连续放出了好几批笔试,我是后来参加第三批的那波人。说实话,前两批的题目我已经在牛客和应届生论坛上蹲了很久,把能搜到的面经都翻了个遍,结果拿到第三批试卷的时候还是愣了一下——题目风格跟前两批明显不一样,更细、更偏实战,而且好几道题都在同一个知识点上往下钻,钻到让你没法靠背题蒙混过关。

这篇文章不打算给你复述原题,毕竟严格来说笔试题目本身是有保密要求的。我想做的,是把第三批这套题背后考察的知识体系、我当时是怎么思考的、以及哪些地方最容易丢分,完整拆开讲一遍。不管你是准备大数据方向的校招,还是已经在做离线数仓、实时计算、数据平台相关的工作,这篇文章里提到的这些考察点和排查思路,应该都能用得上。

1. 2018年这批题到底在考什么样的人

第三批题目给我的第一感受是:字节跳动那时候并不指望招进来的人马上就能干活,但非常在意你有没有完整地接触过一套数据链路。什么叫“完整接触过”?就是你至少应该知道数据从业务端产生之后,经过采集、传输、存储、计算、调度、应用,最终落到报表或算法特征里,这个过程中每个环节大概会遇到什么问题。

那批笔试里有一个很明显的信号:题目没有堆砌特别冷门的知识点,反而是围绕主流的Hadoop生态组件来出题,HDFS、MapReduce、Spark、Hive、Kafka基本都覆盖到了。但考察方式不是让你背概念,而是给一个场景,让你判断用什么组件、为什么用、可能出现什么问题。比如给你一个实时性要求不是特别高的日志分析场景,问你选Spark Streaming还是Storm,然后让你说明理由。这种题没有标准答案,但能看出你有没有真正做过选型,而不是只会在博客上复制别人的技术对比。

另外我注意到一个细节,第三批题目里对“数据质量”和“数据一致性”的考察比重比前两批高。这其实也符合字节跳动当时业务快速扩张的现实——数据量大、口径多、业务迭代快,一旦数据算错,影响的是产品决策和运营策略,所以他们对候选人的数据敏感度要求很高。有一道题大概是问:离线任务每天凌晨跑,某一天发现结果数据比前一天少了10%,你会怎么排查。这种题没有标准答案,关键看你能不能说出一个完整的排查链路:先看调度是否正常,再看上游数据是否完整,然后看是否有数据倾斜,最后看代码逻辑是否被改过。

第三批还有一个特点,就是时间很紧。整张卷子题量不算特别大,但每道题都要写不少字,尤其是场景设计题和排查题,需要你组织语言、分步骤描述。我印象里身边有同学在SQL题上抠了太久,导致后面的大题时间不够,最后草草写了两行就交了。所以后面我会专门讲一下时间分配这件事,这虽然不是知识点,但在笔试里往往比知识点更致命。

1.1 当时大数据校招的竞争格局

2018年是大数据岗位校招开始变得拥挤的一年。前几年大数据还算是比较新的方向,会写个Hive SQL、能跑通MapReduce就能拿到不错的offer。但到了2018年,科班出身的人已经批量涌进来,加上不少做Java后端的人也在往大数据方向转,竞争一下子就激烈了。

在这种情况下,第三批笔试的定位就很微妙。第一批是抢跑,用来锁定最优秀的那批人,题目相对常规;第二批开始加大难度,加入了一些实时计算和架构设计的内容;到第三批,基本就是“从剩下的人里挑潜力股”了,所以题目会更看重思维方式和基础功底,而不是纯粹的知识面宽度。

这也解释了为什么第三批会出现不少“看似入门、实则考察深度”的题。比如HDFS写流程这种题,表面上是让你讲讲Client、NameNode、DataNode之间怎么交互,但如果你只是背过“客户端先请求NameNode,然后创建文件,再写入DataNode”这种话,是拿不到高分的。真正能拿分的是你说得出:写副本时Pipeline是怎么建立的、宕机时副本数不足会怎么处理、什么时候会触发租约过期、为什么读数据的时候不需要走NameNode。这些细节只有真正部署过集群、处理过实际故障的人才会去关注。

1.2 试卷结构和我的整体感受

从题型分布来看,第三批的卷子大致可以分成四块:基础知识选择填空题、SQL和算法题、场景设计题、排查与优化题。选择填空覆盖了Java基础、网络协议、操作系统、数据结构,这部分跟普通后端岗的笔试差别不大,但后面几块就是明显的“大数据”味道了。

SQL题大概有两到三道,要求手写Hive SQL或者Spark SQL,考察点是连续登录、留存率、TopN这一类经典问题。场景设计题一般会给你一个偏字节跳动风格的业务场景,比如短视频的播放日志分析、推荐系统的特征数据准备,让你设计数据链路。排查优化题则更直接,基本上就是给你一个“任务跑得很慢”或“数据对不上”的困境,让你描述排查思路。

我的整体感受是,这套题更像是一份“技术体检报告”,考察的不是你背了多少个框架,而是你脑子里有没有一套完整的、自洽的大数据知识体系。你不需要每个组件都用过,但至少要知道它们解决什么问题、边界在哪里、彼此之间怎么配合。

2. SQL题:考点永远是那几类,但出题角度会有变化

先说SQL题,因为这是大部分候选人花时间最多、也最容易拉开差距的部分。2018年那批SQL题,核心考点仍然是连续登录、留存率、会话划分、TopN、行列转换这些经典场景。但第三批有个变化是,它会把考点藏在更复杂的业务语义里,比如“算出每个用户在某个时间窗口内的活跃天数,并统计活跃天数大于等于3天的用户占比”,这就不是单纯查一张表了,而是要拆分步骤。

我建议遇到这类题,先别急着写代码,花一两分钟把逻辑拆清楚。第一步,拿到原始数据后先做过滤和去重,确定“一次活跃”的粒度是什么——是用户每天只记一次,还是每次播放都记一次。如果原始表是用户行为流水,那一个用户一天可能有多条记录,务必先去重。第二步,确定时间窗口的边界,比如“最近30天”是按自然日算还是按截至今天的滚动窗口算,题目里通常会明确,但如果没明确,考试时可以写清楚自己的假设,这反而能体现你的思考严谨性。第三步才是写SQL,而且写完一定要检查边界条件。

2.1 连续登录问题的三种写法

连续登录问题在2018年的大数据笔试里几乎是必考的,第三批也不例外。题目大概是给你一张用户登录日志表,包含用户ID和登录日期,让你找出连续登录超过N天的用户。这类题的解法其实非常固定,核心思想就是“日期减去序号(或排名)得到一个分组标识”,然后按这个分组标识聚合统计天数。

我比较推荐的做法是用ROW_NUMBER()。逻辑是:先按用户分组、按日期排序,然后给每行分配一个从1开始的序号;接着用登录日期减去这个序号得到一个日期偏移量;最后按用户和这个偏移量分组,统计组内记录数,天数大于等于N的就是答案。

SELECT user_id, group_date, COUNT(*) AS continuous_days FROM ( SELECT user_id, login_date, DATE_SUB(login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date)) AS group_date FROM user_login_log ) t GROUP BY user_id, group_date HAVING COUNT(*) >= N

如果你当时只写出了这种答案,能拿基础分,但拿不到高分。面试官更希望看到你补充说明几个隐含条件。比如:用户一天内多次登录算不算多条记录?如果算,先做去重;如果跨月连续登录,DATE_SUB是否还能正确计算?这个写法可以处理跨月,因为DATE_SUB是按实际日期运算的;再比如,如果登录日期列是STRING类型且格式不统一,怎么保证排序正确?这就涉及数据清洗了。

我当时在博客上看过另一个解法,用LAG()窗口函数去判断当前行与上一行日期是否相差1天,然后做累加标记。这种写法的好处是不用依赖ROW_NUMBER,对于“判断连续”的语义更直观,但写起来会复杂一些,而且逻辑容易出错。笔试中我建议用最稳妥的“日期减序号”写法,不容易翻车。

2.2 留存率计算的注意事项

留存率在2018年校招SQL题里出现频率也很高。第三批那道留存题我记得是给了一张用户活跃表,让你算新用户次日留存率。这个题看着简单,但很多人会栽在“分母”和“分子”的口径上。

正确的逻辑是:先定义一个时间基点,比如某个日期D,找出当天新增的用户集合,然后看这批用户在D+1天有多少人活跃,D+1天的活跃人数除以D天的新增人数就是次日留存率。也就是说,分母是“某日新增且当天有活跃记录的用户”,分子是“这批人在次日仍然有活跃记录的用户”,这个“次日”一定要在新增用户集合内做关联,而不是去全表里找活跃用户。

一个常见的错法是直接拿“全量活跃用户”做分母,这样算出来的根本不是留存率。另一个常见错法是没用DISTINCT去重,导致一个用户当天多次活跃产生了重复计数。这些坑都很基础,但在笔试那种紧张环境下,很多人就是会踩。

2.3 TopN问题:窗口函数的正确打开方式

TopN也是大数据笔试的常客,而且是唯一一个我不太建议用纯SQL老写法去解的题。传统用GROUP BY加ORDER BY LIMIT的写法,在很多场景下拿不到正确结果,尤其是要求“每个分组内的TopN”时,必须用窗口函数的ROW_NUMBER()或RANK()。

比如题目问“统计每个类目下播放量排名前10的视频”,正确写法是先按类目分组、按播放量排序,给每组内分配排名,然后过滤排名小于等于10的记录。写的时候注意用ROW_NUMBER()还是DENSE_RANK(),取决于题目是否要求并列名次占用名额。大多数情况下ROW_NUMBER()就够用,因为它的语义是“物理顺序”,每个视频只有一个排名。

我当时还专门练习过一种稍复杂的TopN变体:要求取“每个用户播放时间最长的前两条视频,且这两条视频的播放来源不能相同”。这种题考察的是在窗口函数之后再做一次条件过滤,难度不大,但很容易漏掉“来源不能相同”这个条件,少写一个过滤就会出大问题。做这类题,我的建议是先按用户分组排序加行号,然后在这个结果集上再按来源去重或过滤,必要时可以拆成多个子查询。

3. 计算引擎题:MapReduce与Spark,考察的重点不是API而是原理

第三批笔试里有一类题目让我印象很深,它不直接问“Spark的transformation和action有什么区别”这种基础题,而是给一个具体任务,问你怎么用Spark实现,然后再追问一句“如果数据量扩大100倍,你会怎么优化”。这种题考察的其实是你对Spark运行原理,尤其是Shuffle、分区、内存管理的理解。

在2018年那个时间点,Spark已经是大数据离线计算的事实标准,MapReduce虽然还在考纲里,但更多是作为一种“底层原理”来考。字节跳动那批题目里也延续了这个思路:MapReduce的基础题会出,但占比不大,Spark的原理和调优才是重点。

3.1 MapReduce题:从流程记忆到故障理解

MapReduce相关的题目,如果你只是背过“InputFormat -> Map -> Shuffle -> Reduce -> OutputFormat”这个流程,最多拿一半分。第三批的题目更倾向于让你描述某个环节的具体行为,比如:Map端输出的键值对是怎么分区、排序和合并的?当Partitioner默认用HashPartitioner时,如果Reduce数量变了,对结果有什么影响?

这里有一个我觉得特别能体现水平的考点:Map端和Reduce端Shuffle的区别。Map端Shuffle是先把结果写到内存缓冲区,默认是100MB,当缓冲区达到阈值(默认80%)时开始溢写,溢写前会做分区排序和合并;Reduce端Shuffle则是从多个Map任务拉取属于自己的分片,边拉取边合并排序,全部拉完后才作为Reduce函数的输入。很多候选人能画出这条链路,但问“为什么缓冲区要设置阈值、为什么80%而不是100%”就答不上来了。其实答案很简单:防止数据写满内存导致阻塞,留出余量给正在进行的序列化和排序操作。这种“临界值设计逻辑”恰恰是考官想看到的。

3.2 Spark题:数据倾斜的排查思路是核心

Spark相关的题目里,数据倾斜几乎一定会出现。第三批那道题大概是给你一个Join操作,说某个Task运行特别慢,其他Task都跑完了,就它一直卡着,让你分析原因并给出解决办法。

数据倾斜的本质是Key分布不均,导致大量数据被分到同一个分区。最常见的原因有两种:一是业务本身的Key就有热点,比如某个大V的ID在流量表里出现的次数远超其他人;二是Join操作中,多个大表关联时,某些Key在两张表里都特别多,导致笛卡尔积爆炸。

排查思路应该分几步走。第一步,先确认是不是数据倾斜,看Spark UI里各个Task的Shuffle Read量,如果某一个Task的读入量比中位数大了一个数量级以上,基本可以判定。第二步,定位倾斜的Key,可以通过采样或者跑一个简单的count group by把TopN的Key打出来。第三步,根据Key的类型选择优化手段。

常见的优化手段有这么几种。如果只是单Key倾斜,可以把大Key加上随机前缀,然后拆成两阶段聚合,即先加随机数打散,聚合一次,再去掉前缀聚合一次;如果是Join倾斜,可以先把大表里倾斜的Key过滤出来,单独做广播或单独处理,剩余数据走正常Join;如果倾斜不严重,也可以直接调整并行度或开启AQE(如果Spark版本支持)。我比较推崇的应答结构是:先说明“为什么会有这个问题”,再给“定位方法”,最后给“解决方案”,这样显得你在真实场景里处理过问题,而不是只背了几条优化建议。

3.3 为什么第三批对“Spark Streaming vs Flink”的考察出现了

第三批有一道题让我意识到,字节跳动当时已经在认真考虑实时计算的选型了。题目大概问:一个需要秒级延迟的数据处理场景,你会选Spark Streaming还是Flink,为什么?

在2018年,Spark Streaming还处于微批处理模式(Micro-batch),它天然是把一段时间的批次数据统一处理,所以延迟下限一般是几百毫秒到几秒;而Flink是真正的流式计算引擎,逐条处理数据,延迟可以做到毫秒级。如果你的场景真的需要秒级甚至毫秒级响应,Flink是更合适的选择。但Spark Streaming也有它的优势:生态统一(离线、实时都能用Spark)、部署维护简单,如果一个团队已经维护了一套Spark离线体系,引入Spark Streaming的边际成本更低。

我当时在笔试里写的是:选择哪个引擎取决于你对“实时性”的定义,如果业务容忍几秒延迟,Spark Streaming完全够用,而且更稳定;如果业务需要严格的事件时间处理、精确一次语义,那Flink更合适。这种回答思路的好处是:不直接站队,而是展示你对技术选型的判断力,这在场景题里非常重要。

4. 数据仓库与建模题:分层设计的细节最能拉开差距

第三批笔试里让我比较意外的是,数据仓库设计类的题目占了不小的比例。很多候选人把精力都放在SQL和Spark原理上,对数仓建模相对轻视,觉得“数仓不就是建几张表嘛”,但字节跳动的题目偏偏要在这方面做文章。

有一道题我现在还记得大概:给你一个内容平台的业务,包括内容发布、用户观看、广告曝光等行为数据,让你设计一套数仓分层结构,并说明每一层的职责。这道题看着很开放,但真正能拿高分的答案,一定是能清晰地说出ODS、DWD、DWS、ADS每一层做了什么、为什么需要这一层、层与层之间的数据流转如何保证。

4.1 数仓分层的价值不止是“清晰”

数仓为什么要分层?网上最常见的回答是“为了清晰、为了复用”,这个回答太泛了。从工程角度说,分层的核心价值有三个方面:第一,隔离原始数据与业务数据,ODS层保留最原始、不可变的数据,避免业务逻辑变更导致无法回溯原始事实;第二,复用公共逻辑,DWD层做明细清洗和标准化,DWS层做主题汇总,这样多张报表可以共享同一份预处理后的数据,不用重复开发;第三,控制数据流向,规范“数据只能从下层流向上层”,出问题时可以快速定位是哪一层出了问题。

第三批题目里还问到了“ODS层要不要做清洗”这种细节点。我的观点是,ODS层原则上只做增量/全量同步和最小限度的格式规范化(比如统一日期格式、编码格式),不该做业务逻辑清洗,因为ODS层的定位是还原原始数据,一旦引入过多清洗逻辑,数据就不再“原始”了,后续如果发现清洗规则有误,很难追溯。DWD层才是做质量过滤、标准化、维度退化的地方。

4.2 维度建模:星型模型与雪花模型的选择依据

维度建模的题目在那批笔试里也出现过,考的是星型模型和雪花模型的区别以及选型依据。星型模型是维度表直接连接事实表,查询时需要Join的层次少,性能好;雪花模型是维度表进一步规范化拆分,消除冗余,但查询时要多Join几层,性能相对差。

如果你只是答到这个层面,只能算中规中矩。那个问题真正的加分点是:在大数据场景下,你为什么倾向于选择星型模型?因为大数据环境重吞吐、延迟敏感度相对较低,但数据量极大,减少Join可以显著降低计算成本;而雪花模型节省的那点存储,在分布式存储面前根本不值一提。所以在字节跳动这种数据量级的场景,星型模型几乎是默认选择。此外,星型模型的维度表更宽、更扁平,对于BI工具和即席查询也更友好。

4.3 数据质量题的答题套路:从被动救火到主动预防

第三批有一道题让我印象特别深,因为它直接问“如果业务方早上发现昨天的核心报表数据为0,你怎么快速定位”。这道题考察的不只是技术,还有工程协作能力和判断优先级。

我当时给的思路分两条线并行。第一条线是看上游:昨天任务的调度是否正常?上游源表是否有数据?数据采集任务是否在某个环节断了?先确认数据是不是根本没进来。第二条线是看任务本身:跑数任务是否成功?有没有重试机制?SQL逻辑是否在上线新版本时被改动?有没有可能是分区字段配错导致读到了空分区?

这道题最有意思的部分是“怎么快速”。我当时的回答是:不要按顺序挨个排查,而是先看最可疑的环节。以我做过数仓的经验,90%的情况是因为调度依赖没有配好、上游任务失败导致下游跑了个“假成功”。所以要第一时间打开调度平台看任务状态的上游依赖,如果没有问题,再去捞昨天的源表数据量,确认有没有数据入口,再往后才是SQL逻辑的排查。这个先后顺序本身就是经验。

5. 底层系统基础:HDFS与Kafka,考察的是你碰过多少真实问题

第三批笔试里关于HDFS和Kafka的题目不算少,但都不是让你写配置文件或命令行,而是考察机制理解。对于没有真正搭过集群的候选人来说,这部分是最容易失分的,因为光靠背八股文很难应对“如果某台DataNode宕机了,正在写的文件会怎样”这种问题。

5.1 HDFS写流程的隐藏考点

HDFS写流程是经典面试题:客户端先调用DistributedFileSystem.create(),NameNode检查权限和路径后创建文件元数据,返回输出流;客户端按块写入,第一个DataNode收到后建立Pipeline,依次复制给第二个、第三个DataNode;写完一个块后,客户端继续写下一个块,全部写完关闭流。这个流程大部分人都能说上来,但第三批的追问方式不太一样。

比如它问:如果Pipeline中某一个DataNode写入失败,会发生什么?正确理解是:DataNode会关闭管道,把已写入的块信息上报NameNode,NameNode标记该副本异常并安排其他DataNode补充副本。客户端也会收到异常响应,然后从队列里移除故障节点,继续向剩余节点写入副本。整个过程对外表现为“写入可能短暂卡顿,但不会失败”,除非所有可用节点都挂了。这种细节,只有在实际运维过集群、看到过DataNode单点故障时日志的人才能讲得清楚。

还有一个隐藏考点是“副本放置策略”。默认策略是第一个副本放在客户端所在节点(如果客户端不在集群内,则随机选一个节点),第二个副本放在不同机架的节点,第三个副本放在与第二个相同机架的另一个节点。这个策略的考量是:第一副本就近写入加快速度,第二副本跨机架保证容灾,第三副本跟第二副本同机架是为了减少跨机架的流量消耗。这个知识点不算难,但如果在笔试里写出来,会显得你对分布式系统的设计约束有真实理解。

5.2 Kafka的offset管理和语义保障

Kafka在大数据链路里几乎是标配了,第三批笔试里也出现了关于它的题目。考得比较多的是Consumer的offset管理方式:老版本默认存储在ZooKeeper中,新版本默认存储在一个内部Topic(__consumer_offsets)中。问你为什么这样改,能答出“ZooKeeper不适合高并发的offset读写,且会引入额外的网络开销”才能拿到分。

更深一层的是消息语义的问题:At Most Once、At Least Once、Exactly Once有什么区别,Kafka怎么实现Exactly Once。大部分人都知道At Least Once靠的是“生产端重试+消费端手动提交offset”,但Exactly Once要答到“幂等Producer + 事务API”这层,才能体现你真的研究过。在笔试里遇到这种题,一定要从“为什么需要”的角度去答,因为单纯背概念太容易被识破了。

5.3 系统设计题:一个完整的日志采集链路怎么设计

场景设计题通常是笔试的大头,第三批也不例外。其中一道题大概是让你设计一个日PV过亿的日志采集分析系统,要求吞吐量大、稳定性高、允许分钟级延迟。这种题没有标准答案,但有标准思路,答得对不对,全看你的链路是否完整、选型是否合理。

我的回答思路是:日志先通过Agent(比如Filebeat)采集到Kafka,Kafka作为削峰填谷的缓冲层,然后由Flink或Spark Streaming消费,经过清洗和聚合后写入HDFS或ClickHouse,供下游分析查询使用。之所以用Kafka做缓冲,是因为日志的写入速度是突刺式的,半夜可能没人写、白天可能瞬间暴增,如果直接写入存储,很容易被流量峰值打挂;Kafka作为缓冲层可以把“突刺流量”变成“均匀流量”。

接下来一定要讲“怎么保证不丢数据”。这里可以提到三个层面:Agent端采用“读后删除”的提交策略,只有确认发到Kafka后才更新文件读取偏移量;Kafka端设置副本因子大于1,并让Producer开启acks=all;消费端采用手动提交offset,处理完一批数据后再提交,禁止自动提交。如果你能把这三个层面完整说出来,评分一定不低。

6. 算法题与机器学习基础:大数据岗的必备底料

第三批笔试里还有一部分算法题和机器学习基础题。这部分题量不大,但很关键,因为如果你算法部分挂掉,即使前面的大数据知识答得再好,也基本没戏。字节跳动对候选人的编码能力要求一直很高,这在2018年就已经很明显了。

我当时拿到的卷子里有手写代码的部分,难度大概在LeetCode Medium到Hard之间,主要涉及数组、链表、二叉树和动态规划。虽然没有特别偏难怪的题,但要求你在有限时间内写出一份完整、能跑、边界条件都处理好的代码,对非科班同学来说压力不小。

6.1 手写代码:边界条件和复杂度分析同样重要

手写代码部分,最容易丢分的不是算法思路不对,而是代码风格和边界条件处理不到位。比如写二分查找时,很多人忘了考虑数组为空或目标值不在数组内的情况;写链表反转时,没有处理空链表和单节点链表;写动态规划时,初始化数组大小搞错一位导致越界。

我的经验是,笔试写代码时必须把边界条件写在最前面,哪怕你觉得题目给定数据一定满足某个条件,也要写防御性判断。面试官看代码不会只看正确性,还会看你思考问题是否全面。一个能把数组为空、长度为1、目标值在最前/最后这些边界情况都考虑到的候选人,在实际工作中写数据处理逻辑时也不容易出bug。

6.2 机器学习基础:特征工程比调参更重要

机器学习基础题在第三批也有出现,但考察的不是深度学习那些前沿内容,而是LR、GBDT、特征工程、评估指标这些基础。有一道题问“特征工程中如何处理缺失值”,看起来很简单,但如果只回答“填充均值/中位数”,得分一定不高。

完整的回答应该包括:如何处理缺失值取决于缺失机制和业务含义。如果缺失率很低,可以直接删除;如果缺失有业务含义(比如“用户没有填写”本身就是一个信号),需要单独编码;如果特征是连续值、缺失率中等,可以用均值/中位数/众数填充,也可以考虑用模型预测缺失值;如果特征是分类值,需要新增一个“未知”类别。此外,填充时要特别注意训练集和测试集使用相同的填充值,避免数据泄露。这种多层次回答才能体现你对机器学习流程的综合理解。

6.3 算法岗与开发岗的题目差异

我身边同时期投字节跳动的同学里,有人面的是大数据开发岗,有人面的是数据分析岗,还有人面的是算法岗。这三个方向在第三批笔试中的侧重点完全不同。开发岗更看重Hadoop、Spark、Kafka这些工具的落地能力和代码能力;数据分析岗更看重SQL、统计检验、AB实验、业务指标口径;算法岗则几乎全是机器学习、深度学习和数据结构题。

如果你投的是大数据开发岗,我建议还是把重心放在“数据处理链路”和“分布式计算原理”上,算法题保持到LeetCode Medium水平就够用,没必要为了几道Hard题浪费大量刷题时间。反过来,如果投的是算法岗,那Hadoop生态的细节可以适当放松,但模型原理和手推公式必须熟练。

7. 笔试中的实战策略:时间分配、答题顺序与易错点

很多人把笔试复习的重心全放在知识储备上,忽略了应试策略,结果就是会的题没时间写、不会的题浪费了大量时间。第三批笔试时间有限,我的亲身体会特别深:如果一张卷子有8道大题,前两道比较基础的SQL题花太多时间推敲细节,后面两道需要大段文字描述的场景设计题就只能匆匆收尾,这非常遗憾,因为场景设计题往往是分值大户。

所以我后来总结了一套笔试时间分配和答题顺序的方法,在这里分享给大家。

7.1 拿到卷子先做“三分钟扫描”

开考后,先不要急着动笔,用三分钟时间把所有题目浏览一遍。这个动作有两个作用:第一,对全局难度有数,知道哪些题是“送分区”、哪些题是“拉分区”;第二,识别出哪些题考查的知识点是有重叠的,比如一道HDFS的题和一道Kafka的题可能都涉及到数据一致性,这时候你应该把最熟悉的那个先做,建立信心。

三分钟扫描之后,我会做一个简单的优先级排序:先做自己有把握的题,尤其是那种“只需要写SQL或代码片段”的题,因为这类题得分稳定且耗时可控;再做需要文字分析的场景设计题和排查题,因为这类题虽然耗时,但只要你思路清晰、步骤完整,即使结论不完美也能拿大部分分;最后做完全没有头绪的题,这类题先用常识判断写一个方向,不要留白,因为笔试阅卷时踩点给分的可能性很高。

7.2 场景设计题的“三段式”回答结构

笔试里的场景设计题或排查题,最忌讳的是想到什么写什么,逻辑混乱。我给这种题总结了一个“三段式”回答结构,这几年凡是按这个结构写的基本都能拿到不错的分数。

第一段,明确需求和约束。先复述或转述题目场景,指出核心需求是哪几个,比如“需要分钟级延迟”“数据量日增过亿”“需要保证精确一次语义”。这不是废话,而是告诉阅卷人你读懂了题,也说明你后续的设计是围绕这些约束展开的。

第二段,给出主链路设计。画一个大致的流程图(文字描述即可),说明数据从采集、传输、计算到存储的完整路径。这个环节要给出选型,并简要说明为什么选择某个组件,比如“选Kafka做缓冲是因为峰值削峰、离线/实时双链路共用一份数据”等。

第三段,讲关键风险和兜底方案。比如“数据重复怎么处理”“任务失败怎么重试”“延迟超标怎么监控告警”。这个环节是拉开分数差距的关键,因为大部分候选人只会描述正常流程,不会主动思考异常情况。如果你能主动补充故障场景和兜底方案,阅卷人会觉得你有真实工程经验。

7.3 容易丢分的三类“非技术”错误

除了知识储备和解题思路,笔试里还有三类非技术错误特别容易让人丢分,我放在一起说。

第一类是审题不细。比如题目要求“用Spark SQL实现”,你写了Hive SQL的语法;题目要求“计算次日留存率”,你算成了当日留存率;题目要求“至少给出两种方案”,你只写了一种。这类错误不是因为不会,而是因为太紧张、读题太快。我的办法是:每道题动笔前,先圈出题目里的关键词——“至少”“只能”“任意”“不超过”这些限定词,再开始作答。

第二类是答案没有结构。很多人在写场景题时喜欢用一大段话从头写到尾,没有分点、没有序号。但笔试阅卷和实际工作是两码事,阅卷人精力有限,一篇密密麻麻的长文很容易被漏看关键点。我的建议是:只要是3个以上的要点,就分点写,每一点用加粗或小标题先亮出结论,然后再展开一两句话解释。这样即使内容不够深入,至少阅卷人一眼就知道你覆盖了哪些点。

第三类是代码/伪代码的格式混乱。如果题目要求写代码或SQL,一定要注意缩进和关键字大小写规范,就算不要求完全可运行,也要尽可能让代码拿到IDE里就能读懂。我见过不少同学在笔试里写SQL不写分号、字段名乱用别名、join条件写反,这些都说明平时练习不够,考前一定要多加训练。

8. 基于第三批真题的准备路线与复盘心得

写到这里,我把第三批笔试考察的各个知识模块都拆开讲了一遍。最后这部分,我想基于这套题的整体画像,给准备大数据校招的朋友们一条实际可行的准备路线,顺便复盘一下我自己的教训。

8.1 知识优先级排序:不是所有内容都要平均用力

如果你现在才开始准备,时间有限,那一定要做好优先级排序。我的建议是:SQL的熟练度排第一,因为这是性价比最高的技能,Hive SQL和Spark SQL都要能写,连续登录、留存率、TopN、行列转换、窗口函数这些场景必须达到“闭着眼睛也能写”的程度。第二优先级是Hadoop生态的核心组件原理,重点是HDFS读写流程、MapReduce/Spark的Shuffle机制、数据倾斜定位与优化、Kafka的消息语义,这些是笔试的高频区。第三优先级才是机器学习和算法题,如果是开发岗,保持平刷力就行,不需要在Hard题上死磕。

8.2 动手练工程,别只刷八股文

2018年那批笔试给我的最大教训是:八股文背得再熟,没有实际动手经验,很多题你还是答不透。我第一次做第三批的模拟题时,觉得HDFS写流程、Spark数据倾斜这些知识点我都知道,但真正让我描述“某台DataNode宕机后会发生什么”时,我讲得磕磕绊绊,因为我从来没有在真实集群上看到过这个故障。

后来我花了一周时间,在自己电脑上用Docker搭了一个一主两从的Hadoop集群,往里灌了1000万条测试日志,专门做各种“破坏性实验”:kill掉一个DataNode、给某个ReduceTask制造数据倾斜、把Kafka的副本因子改成1看看数据丢失长什么样。做完这些实验之后,笔试里凡是涉及“故障”“优化”“排查”的题,我都有画面感了,答起来自然比纯背教材要丰满得多。

8.3 现在回头看,哪些知识点直到今天依然是重点

距离2018年已经过去好几年了,大数据技术栈又发生了不少变化,Flink的地位已经稳固,Spark也迭代了很多版本,数据湖、实时数仓成为新的热门方向。但回头看第三批那套题,有几个知识点直到今天依然是面试和笔试中的“钉子户”:SQL里的窗口函数、数据倾斜的处理方法、Kafka的消息一致性保障、数仓分层设计的思路。

这些知识点之所以长盛不衰,是因为它们不是某个框架的API用法,而是大数据工程中的“底层逻辑”。不管你未来用Flink还是Spark,用Iceberg还是Hudi,只要你还在和数据打交道,你就逃不开Shuffle、分区、一致性、分层建模这些问题。所以准备笔试时,不要只盯着“今年考什么新技术”,而是要把那些经典的、底层的知识理解透;把底层逻辑弄明白了,新技术学起来也会快很多。

最后再说一点实际经验:如果目标是字节跳动这种大厂的大数据岗位,笔试只是第一关,后面还有面试、终面,每一轮都会比笔试更深入。笔试考的是你“知道多少”,面试考的是你“做过什么”和“能不能讲清楚为什么这么做”。所以准备笔试的过程中,一定要为每一道题多准备一个“为什么”的答案,这样后续面试时才不会慌。能在笔试里答得既有细节又有体系,你就已经比很多人走得更远了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询