大数据面试题与面经:HDFS/Hive/Spark/Kafka高频考点复盘

发布时间:2026/9/18 9:03:07
大数据面试题与面经:HDFS/Hive/Spark/Kafka高频考点复盘 1. 大数据面试到底在面什么先摸清考官的出题逻辑面了这么多场我最大的感受是大数据面试题这件事很多人复习方向从一开始就是歪的。大多数人上来就抱着Hadoop八股狂背结果一面被问你项目里这个表为什么这么设计直接卡壳。真实的面经告诉我考点从来不是孤立的知识点而是岗位画像 项目经历 底层原理三条线的交叉验证。考官想知道的是你在这个岗位上能不能干活、踩过坑没有、遇到没见过的场景能不能推理出来。先说结论大数据岗位的面试大致分三个层次。第一层是工具熟练度会不会写Hive SQL、会不会调Spark任务、Kafka怎么保证不丢数据第二层是原理穿透力比如问完shuffle是什么之后追一句为什么Spark要引入sort-based shuffle第三层是场景设计力给你一个日增几十亿条日志的场景让你设计一条从采集到出报表的链路。这三层是从低到高筛选的很多人死在第二层的追问上因为背的是答案不是逻辑。至于压力拉满这四个字其实说的不是考官凶而是追问的密度。我遇到最狠的一场一个HDFS写流程问题被连着追问了七层客户端请求怎么发、NameNode怎么选副本、Pipeline怎么建、某个DataNode挂了怎么办、ack怎么回传、块怎么落盘、第二副本和第三副本写入顺序差在哪。你背的一句客户端向NameNode请求上传文件在这种连击下撑不过两分钟。所以这篇我想聊的不是罗列题库而是把高频考点背后的为什么讲透顺带把我真实踩过的坑摆出来。适合谁看如果你正准备春招秋招的大数据岗、数据开发岗或者工作两三年想跳槽但发现简历上的项目经不起深挖这篇应该对你有用。零基础也能看因为我会尽量用生活化的类比解释底层机制有经验的也可以直接跳到面经复盘和真题速查那几节看看有没有你还没想透的角度。2. 技术栈核心考点按模块逐个击破2.1 Hadoop与HDFS基础题里藏着最深的坑HDFS这块几乎所有面试都从块大小切入。标准答案是128MBHadoop 2.x默认但真正加分的是你能说清为什么是128MB而不是64MB或256MB。逻辑是这样的块太小NameNode要维护的元数据条目就爆炸式增长因为一个小文件也会占一个块块太大MapReduce任务并行度上不去而且单个节点故障时的重传代价大。128MB这个值是寻址时间占传输时间约1%的经验结果——磁盘顺序读100MB/s左右一次寻址约10ms算下来传输1%的寻址时间对应的数据量差不多就在百兆量级。你把这段推导说出来面试官会知道你读过源码之外的思考。副本机制也是必问。默认3副本的放置策略第一份写在客户端所在节点如果客户端在集群内第二份写在同机架的另一节点第三份写到不同机架的节点。为什么这么放第一份本地写省网络第二份同机架兼顾写效率和容灾第三份跨机架保证机架级故障时的数据可用。这里常被追问一句如果客户端在集群外呢答案是第一份随机选一个节点后续策略不变。NameNode的内存估算是我见过最容易翻车的地方。每个文件、每个块、每个副本在内存里大约占150字节的元数据注意是每个副本也就是3副本的块NameNode记录的是块信息加上副本位置实际开销要按块数×副本数来估。如果集群有1亿个小文件光元数据就是十几GB这就是为什么生产上极度反感小文件。小文件的解法这里也顺带说一下上游做合并比如Flume配好滚动策略、Hive侧用concatenate或合并小文件的任务、或者用HAR归档。不要上来就说调大块大小那是外行话。读写流程是拉开差距的地方。写流程里有个细节特别爱考Pipeline中某个DataNode失败之后客户端的处理方式。不是整个重传而是把失败的节点从Pipeline里剔除用剩下的两个节点继续写NameNode会异步补一个副本保证最终副本数是3。这个异步补齐很多人答成重新建整条Pipeline就露馅了。2.2 Hive与SQL真正决定你过不过的一关Hive和SQL绝对是大数据面试里权重最高的模块因为这是数据开发每天吃饭的家伙。基础题内部表和外部表的区别——外部表删表不删数据location指向的目录保留所以数仓里ODS层通常用外部表。分区表和分桶表的区别——分区是目录级拆分用来裁剪数据分桶是文件级拆分用hash(字段) % 桶数主要为了采样和join优化。排序那组四个函数是经典送命题order by全局排序只走一个reducer数据量大直接OOMsort by保证每个reducer内部有序distribute by控制数据怎么分到reducercluster by是distribute by加sort by的简写但只能是升序。生产上最常用的组合是distribute by ... sort by ...既能并行又保证组内有序。数据倾斜是面试的高频重灾区几乎必问。我总结的答题框架是先说现象某个reduce卡在99%不动、task耗时两极分化再说原因key分布不均比如某个空值或者某个热门商品ID最后说方案。方案要分场景讲倾斜场景处理手段适用前提join时大表关联小表Map Join把小表广播到内存小表能放进内存默认25MB阈值join时大小表都不小加盐打散热点key先局部聚合再全局聚合热点key可识别group by 倾斜两阶段聚合先加随机前缀聚合再拆掉前缀聚合聚合类指标可分解空值引发的倾斜空值加随机后缀或过滤掉空值不影响业务结果count distinct 倾斜先group by去重再count或改用近似算法允许误差可上HyperLogLog提示加盐方案一定要说清扩容了多少倍、代价是什么只答加盐两个字是拿不到分的面试官想听的是你知不知道两阶段聚合会多一轮shuffle。开窗函数也是必考。row_number()、rank()、dense_rank()的区别lag/lead取前后行sum() over(partition by ... order by ...)做累计。我见过一道真题求每个用户连续登录的天数。思路是date_sub(login_date, row_number() over(partition by user_id order by login_date))得到的分组标识相同的组就是连续的。这道题看着简单但手写的时候很多人卡在日期函数上。2.3 Spark从原理到调优的连环追问Spark的面试基本围绕三条主线RDD的依赖关系、shuffle机制、内存与调优。先说宽窄依赖。窄依赖是父RDD的每个分区最多被一个子分区使用比如map、filter、union宽依赖是父分区的数据被多个子分区使用典型就是groupByKey、reduceByKey的一部分阶段。宽依赖会触发shuffle是划分Stage的依据。为什么区分窄宽这么重要因为窄依赖失败可以只重算丢失的分区宽依赖失败要重算整个父RDD链这是血缘和容错的核心。groupByKey和reduceByKey的区别是必问的。reduceByKey会在map端先做本地聚合类似Combiner再shuffle网络传输量小groupByKey不做map端聚合把所有value全拉过来大数据量下容易OOM。所以除了确实要保留所有value的场景一律用reduceByKey。同理reduceByKey和aggregateByKey、combineByKey的关系也要能说清后者更灵活前者是特化版本。shuffle机制从Hash Shuffle讲到Sort Shuffle。早期Hash Shuffle每个map task为每个reduce task生成一个文件产生M×R个小文件磁盘和内存压力巨大后来引入 consolidate 机制合并文件。Spark 1.2之后默认Sort Shuffle每个map task只生成一个数据文件加一个索引文件reduce按索引拉取。还有个Bypass机制当reduce task数小于200时走bypass省掉排序直接写文件。被问到什么时候shuffle会退化能说出bypass的阈值和条件就是加分项。内存管理是调优题的入口。Spark 1.6之后是统一内存管理堆内存分成三块Execution内存shuffle、join、sort用、Storage内存缓存RDD用、Other内存用户代码和系统开销。Execution和Storage可以互相借用但都有最小保留比例靠spark.memory.fraction和spark.memory.storageFraction控制。内存溢出常见两种java.lang.OutOfMemoryError: Java heap space堆内存不够通常是数据倾斜或者collect大结果集和GC overhead limit exceededGC太频繁需要调小缓存或增大堆外内存。这里必须结合具体报错讲只说调大executor内存是空洞的。2.4 Kafka与HBase中间件细节题怎么答Kafka面试第一问永远是为什么快。标准答案四点顺序写磁盘、页缓存不自己管理缓存直接借操作系统的、零拷贝sendfile减少内核态和用户态的数据拷贝、批量发送加压缩。这四点要能展开尤其零拷贝要说得清数据从磁盘到网卡不经过用户态这个路径。数据不丢是重头戏。要分生产者、Broker、消费者三段讲。生产者侧acksall现在叫-1、retries设大、开启幂等enable.idempotencetrue。Broker侧replication.factor3、min.insync.replicas2、unclean.leader.election.enablefalse不让落后太多的副本当选leader。消费者侧关闭自动提交业务处理完再手动提交offset。这套组合拳说出来基本就是满分答案。重复消费和幂等也要准备。Kafka本身在0.11之后支持幂等生产者靠PID加序列号去重消费者的精确一次需要配合事务或者下游做幂等。这里有个坑很多人以为enable.idempotencetrue就万事大吉其实它只保证单会话内单分区不重复跨会话或者跨分区还是要靠自己处理。这个细节说出来面试官会觉得你真用过。HBase的核心是RowKey设计因为RowKey决定数据分布。热点问题的解法加盐前面拼随机数、哈希对RowKey做hash、反转把手机号之类的倒序。三种方案各有代价加盐会破坏有序性范围查询变麻烦反转保留一定规律但分布仍然可能不均。要能说清取舍。LSM树结构、MemStore刷盘、HFile合并minor和major compaction也是常问尤其major compaction的IO风暴问题生产上一般会关掉自动major改成手动在低峰期触发。3. 真实面经实录三次压力拉满的面试复盘3.1 一面手写SQL加底层连环追问这场是某互联网公司的大数据开发岗一面一共70分钟全程开着视频手写代码。开场自我介绍之后面试官直接甩了一道SQL题让我在共享屏幕上写。题目是有一张订单表字段是user_id、order_id、order_time、amount求每个用户最近一次下单的订单金额。这题本身不难用row_number()按user_id分组、order_time倒序取rn1就行。但我写完之后他连续追问了四个问题。第一问row_number、rank、dense_rank在这题里分别会有什么结果差异如果你用的是rank同一时间点有多个订单时会并列第一取rn1会漏数据。这就是为什么要用row_number。第二问如果数据量是百亿级你这写法会不会有问题答案是窗口函数在全局排序时开销大可以改成先group by user_id取max(order_time)得到每个用户的最新时间再join回原表这样能利用map join。第三问join的时候如果某个用户有大量重复订单会怎样会不会倾斜第四问直接拐到Hive底层row_number在Hive里是怎么实现的走几个MR任务。注意一面最容易死在只会写不会解释。SQL题写完不是结束而是开始。你要主动说出这写法的性能瓶颈、替代方案、可能的倾斜风险面试官会觉得你有生产意识。这场最后还问了HDFS的块大小推导和MapReduce的shuffle过程答得比较稳通过。3.2 二面项目深挖被问到哑口无言二面是组长面全程没问八股就是盯着简历上那个日均处理2TB日志的项目往死里挖。他第一句是你说说这个2TB是怎么算的我当时就愣了一下因为那个数字是从组长周报里抄来的。然后他追问原始日志多大压缩比多少压缩后落HDFS多少重点说清这条链路因为面试官判断你有没有真正参与过。接着是几个我现在还印象深刻的追问这个链路里Kafka用了多少分区为什么是这个数如果分区数翻倍会有什么影响你们的Spark任务多少个executor、每个多少核、多少内存为什么这么配有没有遇到过数据倾斜怎么发现的怎么解决的解决之后性能提升了多少这些问题背后考的是你到底有没有亲自调过。我这场就败在提升多少这个量化问题上当时答了句快了很多面试官笑了笑后面问题就变少了。这场给我的教训是项目里每个数字都要能追溯到来源每个参数都要知道为什么。分区数的选择通常跟消费端并行度和目标吞吐相关我后来总结的经验是可以按目标吞吐量除以单分区吞吐来估单分区在合理配置下每秒几MB到十几MB但更常见的是按下游Spark的核数来对齐让分区数等于或者略大于总核数避免有的executor空转。3.3 三面场景设计题与开放追问三面是部门负责人风格完全变了不给标准答案全是开放场景。题目是现在要设计一个用户行为分析系统从App埋点采集到最终的报表展示你怎么设计这题没有唯一答案考的是你考虑问题的完整度。我当时的回答分了采集、传输、存储、计算、服务五层但负责人一路追问埋点丢数据怎么办客户端弱网环境下怎么保证不丢服务端接收重复上报怎么去重存储层选Hive还是HBase还是ClickHouse为什么报表要支持秒级查询吗如果要怎么做这些问题没有标准答案但有一个评判标准你有没有说清每个选择的代价。比如选ClickHouse做实时报表好处是查询快代价是写入放大、join能力弱、运维复杂。你能把代价讲出来就说明你思考完整。这场我还被问了一个特别实用的问题你现在的系统如果要把数据延迟从T1降到准实时改动量最小的方案是什么我的思路是保留离线链路不动旁路加一条Flink实时链路先跑一个核心指标做验证验证通过再逐步迁移。负责人对这个最小改动、灰度验证的思路是认可的。三面之后就是HR面聊薪资和稳定性技术上基本定型。4. 高频真题速查表与答题话术模板4.1 面试题分类速查表复习的时候我用一张表把高频题按模块考频易错点归类效率比无序刷题高很多。下面这张是我自己整理的版本星星越多代表越常被问。模块高频题考频常见易错点HDFS块大小、副本策略、读写流程★★★★★内存估算漏算副本数MapReduceshuffle全过程、Combiner条件★★★★说不清溢写和归并YARN三种调度器区别★★★混淆Capacity和FairHive四类排序、数据倾斜、开窗★★★★★倾斜只答加盐Spark宽窄依赖、shuffle、内存模型★★★★★报错类型分不清Kafka不丢不重、ISR、为什么快★★★★★丢数据只答生产者侧HBaseRowKey设计、LSM、Compaction★★★★热点方案只答加盐Flink时间语义、水位线、checkpoint★★★★水位线机制说不清JVM内存分区、GC、OOM排查★★★★只会背不会定位SQL连续登录、TopN、行列转换★★★★★手写时卡在函数细节这表里每一行我建议都准备一个能讲三层的版本第一层是什么第二层为什么第三层生产上怎么用。比如Kafka不丢数据第一层是acks和副本第二层是ISR机制和min.insync.replicas的作用第三层是你线上真的配了什么参数、遇到过什么故障。4.2 答题框架与话术模板被问到不会的题怎么办这是很多人关心的。我的经验是千万别硬编用拆解 类比 迁移的框架来答。比如被问到一个你没用过的组件你可以说这个东西我生产上没有直接维护过但从它的设计目标看它和某某组件解决的是同一类问题我理解它大概会从X、Y两个方向入手不知道对不对。这种答法比瞎编强很多面试官一般会给你引导。技术题的答题结构我固定用四步先下结论再讲原理然后说场景最后补代价。举个例子问到为什么用Spark不用MapReduce结论是迭代计算场景下Spark快原理是DAG调度减少落盘、内存计算、算子优化比如pipeline场景是机器学习迭代、交互式查询代价是内存消耗大、对资源要求高、小数据集反而不划算。这四步下来答案就立体了。对于项目类的追问我准备了一套自检清单每次面试前过一遍这个项目的业务目标是什么衡量指标是什么数据量、QPS、延迟这些数字我从哪儿知道的每个技术选型当时的备选方案是什么为什么不选遇到过最大的故障是什么根因是什么怎么修的如果重做一遍哪里会改这五个问题能答顺项目面基本稳了。我实测下来面试官的项目追问基本都在这五个范围里打转区别只是问得深浅。5. 常见翻车现场与排查式复盘5.1 典型翻车类型复盘了我自己以及周围朋友的面经翻车大概能归成几类。第一类是背答案型答案对但一追问就露底。比如问Spark的内存模型背出统一内存管理四个字追问spark.memory.fraction默认值和作用就答不上来了。这类翻车最可惜因为知识是有的只是没往下挖一层。第二类是项目虚报型简历上写了主导设计其实只是参与了一部分被问到细节全靠编。这类翻车往往发生在二面因为一面考通用知识二面才深挖项目。我的建议是简历上写什么就要能讲透什么参与和主导要诚实把深度放在你真正做过的部分。第三类是思路断线型写SQL或者推演流程的时候写到一半卡住越急越想不起来。这类通常是因为平时刷题都是看着答案写没有真正手写过。我的做法是准备一个空文档把高频SQL题连续登录、TopN、行列转换、留存率关掉答案手写三遍写到肌肉记忆。第四类是心态崩盘型被连续追问之后开始紧张语速变快逻辑变乱。这个只能靠多面来脱敏我前几场面试的时候手心全是汗面到第十场就淡定多了。所以千万别把心仪的公司放在第一场面先拿几场练手。5.2 复盘方法与复习节奏每场面试结束我会立刻花二十分钟把还记得的题记下来标注答得好/答得差/完全不会三档。答得差的题当天就去补因为记忆还热。一周之后把这一周的错题再过一遍看是不是真的补上了。这个方法坚持一个月题库覆盖面会明显变广。复习节奏上我一般把时间切成三块基础八股占四成项目梳理占三成SQL手写和场景题占三成。别把八成都花在背八股上那是性价比最低的。基础八股看的是广度项目看的是深度场景题看的是迁移能力三者缺一不可。提示如果你是在职跳槽时间碎片化建议通勤时间刷SQL思路和真题速查晚上整块时间用来梳理项目和深挖原理别在通勤时做需要高度专注的推导。6. 复习路线与资源取舍6.1 分阶段的时间分配如果离面试还有一个月我会这么排。第一周专攻Hive SQL把高频题型手写到形成条件反射第二周啃Spark和Kafka的原理重点是把shuffle、内存模型、不丢不重这几个大块讲成自己的话第三周梳理项目把前面那五个自检问题写成答案第四周模拟面试找朋友或者对着镜子把高频题讲三遍录音回听你会发现很多自己没意识到的口头禅和逻辑断层。如果只剩一周那就只做两件事项目从头到尾梳理清楚加上高频真题速查表过三遍。原理来不及深挖就背结论加一句具体的机制我了解是XX方向如果需要我可以展开至少不露怯。6.2 技术栈的取舍逻辑大数据技术栈那么多Hadoop、Spark、Flink、Kafka、HBase、ClickHouse、Doris、Iceberg……不可能每个都精通。我的建议是一主一辅主攻你目标岗位JD上出现最多的那个辅修一个相关的。比如做离线数仓的主攻Hive加Spark辅修Kafka做实时数仓的主攻Flink辅修Kafka和ClickHouse。面试的时候被问到不熟的技术诚实说不熟但能从设计理念上做类比比硬装懂强。还有人问要不要刷LeetCode。大数据岗的算法要求比后端低但中等难度的题还是要会尤其数组、字符串、动态规划这几类。我遇到过两场面试有手撕算法都不算难但紧张的时候容易写错边界。平时用碎片时间刷个五六十道常考题就够了不用追求数量。最后分享一个我自己的习惯每面试完一家我会在笔记里写一句这家最看重什么。面多了会发现有的公司重原理、有的重工程、有的重业务理解同一套准备应对不同公司要微调侧重。这个习惯帮我在后面的面试里匹配得越来越准也少走了不少弯路。面试这件事说到底是个双向选择你在被面也在挑对方。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询