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

下载本文档

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

文档简介

Spark高频面试题及详细答案(职场实战版)一、Spark核心基础面试题1、简述Spark和MapReduce的核心区别?这是大数据基础必考题,核心差异集中在运行机制、性能、迭代计算和开销上,实际工作中体感非常明显:第一,计算机制不同。MapReduce是基于磁盘的计算,每一个Map、Reduce阶段结束后都会强制落地磁盘,读写开销极大;Spark核心是基于内存计算,中间结果优先缓存到内存,只有内存不足时才会溢写磁盘,大幅减少IO消耗。第二,迭代计算能力不同。MapReduce不擅长迭代场景,做机器学习、图计算、多次聚合迭代任务时,需要多次提交MR任务,启停开销极高;Spark原生支持迭代计算,缓存中间RDD,非常适合迭代类任务。第三,任务调度和延迟不同。MapReduce任务启动、调度开销大,延迟高,只适合离线批量任务;Spark调度轻量化,既支持离线大批量计算,也支持实时流式计算。第四,功能丰富度不同。MapReduce只有Map、Reduce两种核心算子;Spark提供大量丰富的转换、行动算子,同时内置SQL、流式计算、图计算、机器学习全套组件,生态更完整。补充:MapReduce优势是稳定性极强、容错性高,适合超大规模超低频离线任务;Spark性能更强,但对内存资源要求更高。2、什么是RDD?RDD的五大特性是什么?RDD是Spark的核心数据抽象,全称弹性分布式数据集,是一个只读、可分区、可并行计算的数据集合,也是Spark所有计算的基础。五大核心特性是面试重点,必须记准:1、分区列表:RDD的数据被拆分成多个分区,分区是Spark最小的并行计算单元,分区数量决定任务并行度。2、分区计算函数:每个分区都会执行统一的计算逻辑,通过函数迭代分区内数据,生成新的RDD。3、依赖关系:每个RDD都会记录对上一级RDD的依赖,形成血缘关系,是Spark容错机制的核心。4、分区器(可选):仅键值对类型的RDD有分区器,用于控制数据按照key哈希或范围分区,决定数据分布。5、优先位置列表(可选):记录每个分区最优的计算节点,遵循数据本地化原则,减少数据网络传输。3、RDD的惰性执行机制是什么?Spark的计算分为两步,转换算子和行动算子,惰性执行就是指:所有转换算子都是懒执行的,只有触发行动算子,整个任务才会真正执行。转换算子比如map、filter、flatMap、reduceByKey,执行后只会构建RDD血缘依赖的DAG有向无环图,不会触发任何计算,也不处理数据;只有调用行动算子,比如count、collect、save、foreach、reduce时,Spark才会根据DAG拆分任务、调度资源、执行计算。这么设计的核心目的:可以整合所有计算逻辑,优化整体执行链路,减少重复计算,提升任务整体执行效率。4、RDD宽窄依赖的区别?对任务调度有什么影响?宽窄依赖是Spark任务划分Stage的核心依据,日常调优经常用到。窄依赖:子RDD的每一个分区,只依赖父RDD的一个分区。典型算子:map、filter、flatMap、union。特点:数据不需要洗牌,同一个Stage内执行,计算效率高,容错恢复成本低,只需要重算出错的分区。宽依赖:子RDD的一个分区,依赖父RDD的多个分区,会产生Shuffle数据洗牌。典型算子:groupByKey、reduceByKey、join、distinct。特点:会触发磁盘IO和网络传输,开销大;宽依赖是Stage切割的边界,每一次Shuffle都会生成一个新的Stage。总结:Spark会把连续的窄依赖算子合并为一个Stage,遇到宽依赖就切分Stage,Stage内部并行执行,Stage之间串行执行。5、Spark任务提交后,整体运行流程是什么?以Standalone/Yarn集群模式为例,完整运行流程非常清晰:1、客户端通过spark-submit提交任务,初始化SparkContext,连接集群资源管理器(ResourceManager/StandaloneMaster)。2、资源管理器接收请求,分配资源,启动Driver进程。3、Driver解析用户代码,构建RDD依赖的DAG图,通过DAGScheduler根据宽窄依赖切分Stage,生成任务集。4、TaskScheduler调度任务,向集群申请Executor资源。5、集群节点启动Executor进程,接收Driver分发的任务。6、Executor执行Task,通过线程池并行处理分区数据,执行过程中完成数据读写、Shuffle、缓存等操作。7、任务执行完毕后,返回结果给Driver,释放集群资源,任务结束。二、Spark算子与Shuffle面试题6、reduceByKey和groupByKey的核心区别?工作中如何选择?这是面试超高频题,核心差距在预聚合和性能,生产环境优先用reduceByKey。1、执行机制不同:reduceByKey会在map端先做局部预聚合,再将聚合后的少量数据进行Shuffle;groupByKey不会预聚合,直接把所有原始数据全部Shuffle传输。2、性能差异:大数据量场景下,reduceByKey极大减少Shuffle数据量,大幅降低网络传输和磁盘IO,性能远高于groupByKey;groupByKey数据量大时极易造成Shuffle溢出、任务卡顿、OOM。3、结果区别:两者最终聚合结果一致,但底层链路完全不同。使用场景:单纯的key聚合、求和、求最值、计数,一律用reduceByKey;需要获取key对应的完整数据集、无法提前预聚合的场景,才用groupByKey。7、SparkShuffle的流程是什么?Shuffle过程会出现哪些问题?Shuffle是把相同key的数据聚合到同一个分区的过程,分为map端和reduce端两个阶段。Map端:Task处理完数据后,根据key的分区规则,将数据写入不同分区文件,同时做排序、预聚合,最终生成Shuffle数据文件和索引文件。Reduce端:Task根据索引文件,拉取所有map端对应的分区数据,合并、排序后进行最终聚合计算。Shuffle常见问题:数据倾斜、磁盘溢写、网络传输超时、Shuffle文件丢失、任务数据量大导致卡顿、内存溢出。8、map和flatMap的区别?日常使用场景?map是一对一转换,输入一条数据,输出一条数据,只做数据结构、字段、数值的转换,不改变数据条数。比如将一行数据截取字段、类型转换、拼接字符串。flatMap是一对多转换,输入一条数据,输出多条数据,会打散数据结构。比如拆分一行文本的单词、拆分数组、炸裂多行数据。简单总结:只改数据内容用map,拆分、炸裂数据用flatMap。三、Spark缓存与容错面试题9、Spark缓存级别有哪些?生产环境怎么选?Spark核心缓存级别共5种,默认是MEMORY_ONLY:1、MEMORY_ONLY:仅缓存内存,内存不足直接丢弃分区数据,需要时重算,节省磁盘但重算开销大。2、MEMORY_AND_DISK:优先缓存内存,内存不足溢写磁盘,生产最常用,兼顾性能和稳定性。3、MEMORY_ONLY_SER:序列化后缓存内存,占用内存更小,读取需要反序列化,速度稍慢。4、MEMORY_AND_DISK_SER:序列化缓存,内存不足写磁盘,适合超大数据集缓存。5、DISK_ONLY:仅缓存磁盘,性能最差,极少使用。生产选择原则:高频复用的中间RDD,优先MEMORY_AND_DISK;数据量极大、内存紧张的场景,用MEMORY_AND_DISK_SER;一次性计算的RDD不缓存。10、Spark的容错机制是什么?Spark核心容错依靠RDD血缘机制,不需要像MR那样频繁落地磁盘容错。当某个分区Task执行失败时,Spark会根据RDD的依赖血缘,追溯父RDD,只重新计算出错的分区数据,不需要重算全量数据,容错恢复效率很高。如果是缓存数据丢失,也可以通过上游血缘重新计算恢复。另外Spark支持Task重试、Stage重试、Executor故障重启机制,保障任务稳定运行。四、Spark数据倾斜面试题(核心高频)11、什么是数据倾斜?产生原因和现象是什么?数据倾斜就是数据分布不均匀,大部分数据集中在少数几个key上,导致对应的Task处理数据量远超其他Task。产生原因:业务数据本身不均衡,比如大量空值key、默认key、热点用户、热点品类;分区算法单一,key哈希冲突集中。现象:任务大部分Task很快执行完成,个别Task一直卡住、耗时极长;严重时出现内存溢出、Shuffle失败、任务超时失败。12、生产环境数据倾斜的解决方案有哪些?按优先级从简单到复杂,分享工作中最常用的几套方案:1、过滤热点key:如果空值、无效值、热点脏数据不影响业务,直接过滤,最简单高效。2、局部预聚合:针对聚合类倾斜,先在map端预聚合,减少Shuffle数据量,缓解倾斜。3、加盐打散聚合:核心通用方案。对热点key拼接随机数打散,先局部聚合,再去掉随机数二次聚合,彻底解决热点key集中问题。4、拆分倾斜任务:将热点key单独拉出来计算,非热点key正常计算,最后合并结果。5、调整分区数+优化Shuffle参数:增大Shuffle分区,合理设置内存参数,避免溢写和OOM。五、Spark调优面试题13、Spark常用的资源参数调优有哪些?都是生产高频配置,核心参数如下:1、executor-cores:每个Executor核心数,一般配置3-5核,过多会导致线程竞争。2、executor-memory:每个Executor内存,分为堆内内存和堆外内存,根据数据量调整。3、num-executors:Executor数量,控制集群资源占用和并行度。4、spark.default.parallelism:默认并行度,一般设置为集群核心数的2-3倍,避免并行度不足。5、spark.shuffle.file.buffer:Shuffle写缓冲区,调大可减少磁盘溢写。6、spark.executor.memoryOverhead:堆外内存,解决大数据Shuffle堆外溢出问题。14、Spark任务卡顿、执行慢,排查思路是什么?工作中标准排查流程,自上而下:1、查看任务监控页面,判断是否存在数据倾斜(个别Task耗时极高)。2、查看Shuffle读写数据量,判断是否Shuffle数据过大、频繁溢写磁盘。3、检查并行度是否过低,分区数太少,单个Task处理数据过多。4、检查缓存使用是否合理,是否存在大量重复计算、未复用中间RDD。5、查看资源配置,内存、核心是否不足,是否资源抢占、队列拥堵。6、排查代码问题,比如频繁collect拉取全量数据、未过滤脏数据、重复Shuffle。15、Spark常见OOM内存溢出原因及解决办法?常见原因:数据倾斜导致单Task数据量过大;并行度太低;缓存大量无用数据;collect收集超大数据集;Shuffle堆外内存不足。解决办法:1、解决数据倾斜,打散热点key。2、调高并行度,拆分大分区。3、合理释放缓存,不用的RDD及时unpersist。4、避免大规模collect,分区处理数据。5、调大堆外内存、Shuffle缓冲区参数。六、SparkSQL核心面试题16、SparkSQL的执行流程是什么?1、接收SQL语句,进行语法解析、词法解析,生成未优化的逻辑计划。2、经过Catalyst优化器,进行规则优化,比如谓词下推、列裁剪、常量折叠、Join顺序优化,生成优化后的逻辑计划。3、将逻辑计划转换为物理计划,选择最优的执行算子(BroadcastJoin、ShuffleJoin)。4、生成RDD任务,提交集群执行,返回查询结果。17、Spark两种Join方式区别:BroadcastJoin和ShuffleJoin?BroadcastJoin(广播连接):小表广播到大表所有Executor,无需Shuffle,性能极高。适用场景:一张大表、一张小表(小表一般几百兆以内)。ShuffleJoin(洗牌连接):两张表都进行Shuffle分区,相同key分到同一分区关联。适用场景:两张都是大表,无法广播。工作中优化原则:能走广播Join绝不走ShuffleJoin,手动开启广播参数,提升关联效率。18、什么是谓词下推?有什么作用?谓词下推是SparkSQL的核心优化规则,就是将where过滤条件,尽可能下推到数据源读取阶段,在读取数据时直接过滤,而不是读取全量数据后再过滤。作用:大幅减少读取的数据量,减少内存占用、减少后续计算开销,极大提升查询效率。日常开发中尽量提前过滤数据,避免全表扫描。七、SparkStreaming核心面试题19、SparkStreaming的执行原理?SparkStreaming是微批处理架构,核心是将实时数据流按照设定的批次间隔(比如1s、5s)切分成一个个小批次数据,每一个批

温馨提示

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

评论

0/150

提交评论