Hadoop、Spark 高频面试题及详细答案(实战版)-1_第1页
Hadoop、Spark 高频面试题及详细答案(实战版)-1_第2页
Hadoop、Spark 高频面试题及详细答案(实战版)-1_第3页
Hadoop、Spark 高频面试题及详细答案(实战版)-1_第4页
Hadoop、Spark 高频面试题及详细答案(实战版)-1_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hadoop、Spark高频面试题及详细答案(实战版)一、Hadoop核心面试题1.简单说说Hadoop的核心组件及各自作用Hadoop核心由三大组件组成,日常开发和运维最常用的是HDFS、YARN、MapReduce,分工非常明确:HDFS是分布式文件存储系统,主要负责存数据。它把大文件拆分成分块存储在集群不同节点,同时做多副本冗余,保证数据不丢失、可高并发读取,是整个大数据生态的存储底座。YARN是资源调度框架,负责管集群资源。相当于集群的“调度总管”,统一分配服务器的CPU、内存资源,调度各个任务的运行、排队、重启,管控Spark、MapReduce、Hive等所有任务。MapReduce是原生离线计算框架,负责做数据计算。分为Map阶段分片处理数据、Reduce阶段聚合汇总数据,适合海量离线批量计算,稳定性极强,但迭代计算、实时计算性能较差。2.HDFS的架构原理,NameNode、DataNode职责区别HDFS采用主从架构(Master/Slave),核心节点为NameNode、DataNode,还有辅助节点SecondaryNameNode。NameNode是主节点,核心存元数据。主要记录文件目录结构、文件分块信息、每个数据块存储在哪些节点,不存储真实业务数据。同时负责接收客户端读写请求、管理数据块副本分配、集群节点状态监控。整个HDFS的读写都依赖NameNode调度。DataNode是从节点,负责存真实数据。按照NameNode的指令存储、读取、删除数据块,默认3副本存储,定时向NameNode上报自身存储状态和心跳信息。集群大部分节点都是DataNode。SecondaryNameNode不是NameNode备用节点,核心作用是合并镜像文件和编辑日志。定期拉取NameNode的fsimage和edits日志,合并生成新的镜像文件,减轻NameNode压力,避免日志无限膨胀。主节点故障后,它无法直接接管服务。3.HDFS副本机制及副本存放策略HDFS默认副本数为3,目的是防止单节点故障导致数据丢失,保证数据高可用。默认存放策略非常贴合生产高可用需求,具体规则:第一个副本:存放在客户端所在的节点,如果客户端不在集群内,随机选集群正常节点。第二个副本:存放在和第一个副本同机架、不同节点,避免单节点故障丢失数据。第三个副本:存放在和前两个副本不同机架,避免整机架断电、故障导致所有副本丢失。这套策略兼顾了读写性能和数据安全性,同机架传输速度快,跨机架保证容灾能力。4.HDFS读写流程详细说明写入流程:1.客户端发起文件写入请求,NameNode校验权限、文件是否存在,校验通过后返回写入权限。2.客户端将文件切分数据块,向NameNode申请数据块对应的存储节点列表。3.客户端按照副本策略,将数据块先写入第一个DataNode,第一个节点同步数据到第二个、第三个副本节点。4.单个数据块所有副本写入完成后,客户端继续写下一个数据块,所有块写完后,向NameNode提交文件写入完成,关闭文件。读取流程:1.客户端向NameNode请求读取指定文件,NameNode返回文件对应的所有数据块、以及每个块的存储节点列表。2.客户端优先读取同机架、距离最近的DataNode数据,减少网络开销。3.逐块读取数据、拼接成完整文件,读取过程中如果节点故障,自动切换到该数据块的其他副本节点读取。5.NameNode高可用(HA)实现原理原生单NameNode存在单点故障问题,生产环境全部开启HA模式,架构包含两个NameNode(Active、Standby)、Zookeeper、JournalNode。1.双NameNode:一个处于Active状态,对外提供读写服务;一个处于Standby状态,实时同步数据,不对外服务。2.JournalNode集群:替代原来的单机日志存储,Active节点的edits日志实时同步到所有JournalNode,Standby节点实时读取JournalNode日志,保持两个主节点元数据完全一致。3.Zookeeper负责故障转移:ZK监控两个NameNode状态,一旦Active节点宕机、心跳中断,ZK触发选举,Standby节点切换为Active状态,接管所有读写请求,实现秒级故障转移。6.YARN工作机制、ResourceManager和NodeManager作用YARN同样是主从架构,核心节点ResourceManager(RM)、NodeManager(NM)。ResourceManager是全局资源调度中心,集群唯一主节点。负责接收所有任务提交请求、分配全局CPU/内存资源、调度任务排队和执行、监控NodeManager状态、处理任务失败重试。是整个集群的资源总管。NodeManager是每个机器的节点管理者,每台集群节点部署一个。负责管理当前节点的资源、启动和监控任务容器(Container)、定时向RM上报节点资源使用情况和任务运行状态、回收空闲资源。Container是YARN资源调度的最小单位,所有任务都运行在Container中,每个Container独占固定的CPU、内存资源,任务之间资源隔离,互不干扰。7.MapReduce执行流程、Map和Reduce阶段详解整个流程分为6个核心步骤,贴合离线数据处理全流程:1.数据分片:客户端将输入文件按固定大小分片,每个分片对应一个Map任务。2.Map阶段:读取分片数据,执行自定义Map逻辑,输出key-value键值对,经过分区、排序、局部聚合后写入本地磁盘。3.Shuffle阶段:这是MR最核心、最耗时的阶段。负责将所有Map输出的数据,按照key分区拉取、合并、全局排序,把相同key的数据汇总到同一个Reduce节点。4.Reduce阶段:每个Reduce任务接收对应分区的有序数据,执行自定义聚合逻辑,完成数据汇总、统计、分组。5.结果输出:Reduce处理完成后,将最终结果写入HDFS。6.任务收尾:框架统计任务运行日志、资源占用,回收资源,任务结束。二、Spark核心面试题1.Spark和MapReduce的核心区别,为什么Spark更快两者都是大数据计算框架,核心差异在运行机制、性能、适用场景,也是面试高频对比题:1.存储机制不同:MapReduce所有中间结果全部落磁盘,每一轮计算都要读写磁盘;Spark基于内存计算,中间数据优先缓存到内存,只有内存不足时才落盘,极大减少磁盘IO。2.任务模型不同:MR是一刀切的线性任务,迭代计算需要多次启停任务、反复读写数据;Spark基于DAG有向无环图调度,会优化任务依赖,合并重复计算,减少任务开销。3.调度效率不同:MR任务启动、销毁开销大;Spark线程池复用线程,任务启动速度快,小任务优势极其明显。4.场景不同:MR稳定性极高,适合超大批量离线任务;Spark兼顾离线、实时、迭代计算(机器学习、图计算),通用性更强。总结:Spark快的核心原因就是内存缓存+DAG任务优化+减少磁盘IO+线程复用。2.Spark核心架构及各组件作用Spark运行架构分为驱动端、执行端、集群资源端,核心组件如下:1.Driver(驱动程序):任务的总指挥。运行main方法,解析用户代码,构建DAG任务依赖,划分Stage,生成任务调度,分发任务到Executor,汇总任务结果。2.Executor(执行器):部署在各个工作节点,负责真正执行计算任务。每个Executor包含多个线程,并行执行Task,同时负责缓存RDD数据。3.ClusterManager(集群管理器):常用YARN、Standalone、K8s,负责为Spark任务分配资源、启动Driver和Executor。4.Task(任务):Spark最小执行单元,一个分区对应一个Task,负责单分片数据的计算。3.什么是RDD?RDD五大特性、惰性求值原理RDD是Spark的核心数据模型,全称弹性分布式数据集,是一个只读、分区、可并行计算的数据集合。五大核心特性:1.分区列表:数据被拆分为多个分区,分布在集群不同节点,支持并行计算。2.分区计算函数:每个分区都有对应的计算逻辑,用于生成新RDD。3.依赖关系:记录当前RDD和父RDD的依赖,任务失败时可以基于依赖重新计算,实现容错。4.分区器:仅键值对RDD有,控制数据分区规则,保证相同key落在同一分区。5.最优位置列表:记录每个分区的最优计算节点,优先本地计算,减少网络传输。惰性求值:Spark中所有转换操作(map、filter、flatMap等)都是懒执行,只会记录操作依赖,不会立即执行;只有遇到行动操作(count、collect、save等)时,才会触发DAG调度,真正执行计算。这个机制大幅减少无效计算,提升效率。4.Spark宽窄依赖、Stage划分规则宽窄依赖是Spark任务调度、Stage划分的核心依据:窄依赖:子RDD的一个分区只依赖父RDD的一个分区,数据不需要跨节点洗牌。比如map、filter、flatMap、union操作。窄依赖可以流水线执行,效率极高。宽依赖(Shuffle依赖):子RDD的一个分区依赖父RDD的多个分区,需要跨节点拉取数据、洗牌重组。比如groupBy、reduceByKey、join、distinct操作。宽依赖会产生Shuffle,开销大,是任务性能瓶颈核心点。Stage划分规则:Spark以宽依赖为边界划分Stage。从最后一个行动算子往前推,遇到宽依赖就切分一个新Stage。一个Stage内部全部是窄依赖操作,可并行执行;不同Stage串行执行,必须上一个Stage执行完成,下一个才能执行。5.SparkShuffle原理及优化点Shuffle的核心作用是对数据重新分区、重组,把相同key的数据汇总到同一个Reducer节点,是分组、聚合、连接操作的基础。基础流程:Map端分区写磁盘文件→Reduce端拉取对应分区数据→合并排序→聚合计算。生产常用优化:1.优先使用reduceByKey代替groupByKey:reduceByKey在Map端先做局部聚合,大幅减少Shuffle传输数据量;groupByKey直接传输全部数据,无预聚合,性能差。2.调整Shuffle分区数:分区数过小会导致单个Task数据量大、数据倾斜;分区数过大产生大量小任务,增加调度开销。3.开启Shuffle压缩:压缩Shuffle读写数据,减少磁盘和网络IO。4.使用SortShuffle替代HashShuffle:默认SortShuffle磁盘文件更少,稳定性更强,适合大数据量场景。6.Spark数据倾斜现象、原因、解决方案数据倾斜是生产最常见问题,表现为:大部分Task几秒跑完,个别Task运行极慢、OOM报错,任务整体卡在最后几个任务。核心原因:key分布不均,大量相同key的数据集中在同一个分区、同一个Task执行,导致单任务数据量爆炸。常见于join、groupBy、countByKey场景。常用解决方案(由简到繁):1.过滤无效倾斜key:如果是空值、特殊字符导致的倾斜,直接提前过滤,最简单高效。2.局部聚合+全局聚合:groupBy类倾斜,先加随机前缀做局部聚合,再去掉前缀全局聚合,打散数据。3.加盐打散join:两个表join倾斜时,大表key加随机数打散,小表扩容匹配,解决热点key倾斜。4.单独处理热点key:识别热点key,单独抽出来计算,非热点key正常计算,最后合并结果。7.Spark缓存机制、cache和persist区别Spark缓存是提升重复计算任务性能的核心手段,将高频使用的RDD结果缓存,避免重复计算。cache():底层默认调用persist(MEMORY_ONLY),只将数据缓存到内存,内存不足时直接丢弃分区数据,下次使用需要重新计算。persist():支持多种缓存级别,可手动指定存储策略,灵活性更高。常用级别:内存缓存、内存+磁盘、仅磁盘、堆外内存等。内存不足时会自动溢写磁盘,不会丢失数据。生产建议:高频复用、数据量小的RDD用cache;数据量大、迭代计算的任务用persist指定内存+磁盘缓存,避免OOM。8.SparkOnYARN两种模式(Cluster、Client)区别及适用场景Yarn-Client模式:Driver运行在提交任务的客户端机器,Executor运行在集群节点。优点:日志直接打印在客户端,调试方便;缺点:客户端机器故障会导致任务中断,不稳定。适合测试、调试场景。Yarn-Cluster模式:Driver和Executor全部运行在集群节点,全程由YARN管理。优点:稳定性极强,客户端退出不影响任务运行;缺点:调试日志需要查看集群日志,排查稍麻烦。适合生产正式定时任务。9.Spark常见OOM原因及解决办法1.数据倾斜:单Task数据量过大,超出内存上限。解决:打散数据、预处理过滤、拆分热点key。2.缓存过量:大量RDD缓存占用全部内存。解决:合理设置缓存级别、手动释放无用缓存、减少全量缓存。3.小文件过多:大量小文件读取产生大量Task,内存开销大。解决:任务前合并小文件。4.算子不当:col

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论