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

下载本文档

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

文档简介

Spark面试题及详细答案(企业真实版)一、Spark基础核心面试题1、简单说说Spark和MapReduce的区别?这是大数据面试高频基础题,核心差异集中在性能、执行流程、迭代计算和资源开销上。第一,计算机制不同。MapReduce是基于磁盘的计算,每一轮Map、Reduce任务结束后,结果都会落地磁盘,读写开销极大;Spark核心是基于内存计算,中间计算结果优先缓存到内存,只有内存不足时才会落地磁盘,大幅减少IO消耗。第二,迭代计算能力不同。大数据场景下的机器学习、图计算、多维统计都是多轮迭代任务,MapReduce每一次迭代都要重新提交任务、读写磁盘,效率极低;Spark可以将中间数据集缓存,迭代时直接读取内存数据,速度提升数十倍。第三,执行模型不同。MapReduce只有Map和Reduce两种固定算子,复杂业务需要编写多个MR任务串联;Spark提供了上百种丰富算子,转换、聚合、过滤、分区操作灵活,业务代码更简洁。第四,资源调度和容错不同。MapReduce资源调度固定,任务启动开销大;Spark支持动态资源调度,且基于RDD血缘容错,无需全部重算,只需要重算出错的分区任务。劣势方面,Spark对内存依赖高,集群内存资源不足时,性能会大幅下降,而MapReduce稳定性更强,适合超大规模离线海量数据处理。2、什么是RDD?RDD的五大特性是什么?RDD是弹性分布式数据集,是Spark最核心的数据抽象,是一个只读、可分区、可并行计算的数据集合,也是Spark所有计算的基础。五大核心特性:1、一系列的分区:RDD的数据被切分成多个分区,分区是Spark最小的计算单元,一个分区对应一个Task执行。2、每个分区的计算函数:针对每一个分区数据,都会执行对应的计算逻辑,所有算子本质都是对分区数据的迭代计算。3、一系列的依赖关系:RDD是不可变的,每次转换都会生成新的RDD,新旧RDD之间形成血缘依赖,这是Spark容错的核心。4、可选的分区器:只有键值对类型的RDD才有分区器,用于控制数据分区规则,比如Hash分区、Range分区,决定数据分配到哪个Executor。5、优先位置列表:Spark遵循移动计算不移动数据的原则,调度任务时优先将Task分配到数据所在的节点,减少数据网络传输。3、Spark宽窄依赖的区别?各自的应用场景?宽窄依赖是根据父子RDD的分区对应关系划分的,也是划分Stage的核心依据。窄依赖:父RDD的一个分区,只对应子RDD的一个分区,数据不会发生混洗。典型算子:map、filter、flatMap、union。特点:任务可以串行执行,无需网络传输,计算效率高,单个分区故障只需要重算当前分区。宽依赖:也叫Shuffle依赖,父RDD的多个分区对应子RDD的一个分区,数据需要重新分区、跨节点传输。典型算子:groupByKey、reduceByKey、join、distinct、sortByKey。特点:会产生Shuffle读写,开销大,是Spark性能瓶颈主要来源;宽依赖出现的位置,就是Stage切割的位置。场景:窄依赖用于简单的数据清洗、转换、过滤;宽依赖用于数据聚合、关联、排序、去重等需要全局数据重组的场景。4、Spark任务执行流程(完整口述版)1、客户端提交Spark任务,资源调度器(Yarn/Standalone)启动Driver进程,Driver初始化SparkContext,构建任务运行环境。2、SparkContext解析用户代码,从源头创建初始RDD,通过一系列算子转换,构建完整的RDD血缘依赖图(DAG)。3、DAG调度器遍历DAG,根据宽依赖切割Stage,窄依赖的连续算子合并为一个Stage,Stage按照先后顺序排序。4、Task调度器将每个Stage拆分为多个Task,Task数量等于当前Stage最后一个RDD的分区数。5、Driver向资源调度器申请Executor资源,启动Executor进程,Executor初始化线程池,等待执行任务。6、Driver将Task分发到各个Executor执行,Executor执行分区计算逻辑,中间结果按需缓存。7、所有Task执行完成后,结果汇总到Driver,输出最终结果、写入文件或数据库,任务结束释放资源。二、Spark算子核心面试题1、transform和action算子的区别?1、执行机制不同:transform是惰性执行,只记录RDD依赖和计算逻辑,不触发实际计算;action是触发计算的算子,执行后会触发整个DAG任务运行。2、返回值不同:transform返回新的RDD,可继续链式调用算子;action返回非RDD结果,比如数值、数组、文件,无法继续链式计算。3、资源开销不同:多个连续的transform只会记录逻辑,不会产生任务;每一次action都会单独触发一次Job,频繁action会产生大量Job,严重影响性能。常用transform:map、filter、flatMap、join、groupByKey、reduceByKey、sortBy。常用action:count、collect、first、take、saveAsTextFile、foreach、reduce。2、reduceByKey和groupByKey的区别?工作中为什么优先用reduceByKey?这是面试必考重点,核心差异在预聚合机制和Shuffle数据量。groupByKey:只做数据分组,没有预聚合。Shuffle前不会合并数据,所有相同key的海量数据全部跨节点传输,Shuffle读写数据量极大,极易造成数据倾斜、OOM,性能很差。reduceByKey:支持Map端预聚合。在数据Shuffle传输之前,先在每个Executor本地对相同key的数据做一次聚合,大幅减少跨节点传输的数据量,Shuffle开销大幅降低,性能远高于groupByKey。工作中原则:只要是聚合统计场景,优先使用reduceByKey、aggregateByKey、foldByKey,禁止直接使用groupByKey做聚合。只有单纯分组、不聚合的场景,才用groupByKey。3、map和flatMap的区别?map是一对一转换,输入一条数据,输出一条数据,数据条数不会改变,适合字段转换、类型转换、字段新增/删除。flatMap是一对多转换,输入一条数据,可以输出多条数据,会打散数据结构,适合拆分场景。比如一行日志包含多个单词、一条订单包含多个商品,需要拆分多行数据。三、Spark缓存与持久化面试题1、cache和persist的区别?常用缓存级别cache是persist的简化版本,底层默认调用persist(MEMORY_ONLY)。cache无法手动指定缓存级别,只能将数据缓存到内存;persist支持多种缓存级别,可以自由控制内存、磁盘、副本存储策略。常用缓存级别:1、MEMORY_ONLY:只缓存内存,内存不足则丢弃分区数据,下次使用需要重算,默认级别。2、MEMORY_AND_DISK:优先缓存内存,内存不足落地磁盘,最常用、最稳妥的生产级别。3、MEMORY_ONLY_SER:内存序列化存储,节省内存空间,读取稍慢,适合大数据量缓存。4、DISK_ONLY:只缓存磁盘,几乎不用,性能极差。2、什么场景需要开启缓存?生产缓存注意事项适用场景:多次迭代、多次复用的RDD,比如多维统计、机器学习迭代、多算子重复调用同一个数据集。缓存后避免重复计算,大幅提升任务速度。生产注意事项:1、不要缓存一次性使用的RDD,浪费内存资源;2、大数量集优先使用序列化缓存,防止内存溢出;3、任务结束必须手动释放缓存(unpersist),避免集群内存占用过高;4、缓存优先缓存经过过滤、聚合后的小数据集,不要缓存原始海量日志数据。四、Spark数据倾斜面试题(核心重点)1、什么是数据倾斜?数据倾斜的现象和原因?数据倾斜就是数据分布不均匀,大量数据集中在少数几个Key上,导致个别Task数据量极大,大部分Task数据量极小。现象:任务执行大部分Task很快跑完,个别Task卡在99%长时间不动;个别Executor内存溢出、GC频繁;任务运行时间远超正常预期。核心原因:Shuffle过程中,相同Key的数据被分发到同一个分区、同一个Task,热点Key数据量过大。常见于join、groupBy、聚合、分组统计场景。2、生产中常用的数据倾斜解决方案(从简单到复杂)1、过滤无效热点Key:如果倾斜Key是无效数据(比如null、空字符串、脏数据),直接在前置过滤掉,最简单高效。2、局部聚合+全局聚合:针对聚合类倾斜,先在Map端做预聚合,减少重复数据,降低倾斜程度。使用reduceByKey替代groupByKey就是这个原理。3、加盐打散(最常用):对倾斜Key拼接随机数,打散到多个分区,先局部聚合,再去掉随机数做全局聚合,彻底解决热点Key倾斜。4、拆分大Key单独处理:识别出热点Key,将热点数据单独抽取出来计算,非热点数据正常计算,最后合并结果。5、调整分区数+Shuffle参数:适当增大Shuffle分区数,优化Shuffle缓冲区参数,缓解轻微倾斜。五、Spark调优面试题(生产实战)1、Spark常见性能调优方向1、代码算子调优:杜绝重复shuffle、杜绝频繁action、优先预聚合、少用重分区算子;2、数据倾斜调优:过滤脏数据、加盐打散、拆分热点Key;3、资源参数调优:合理配置Executor内存、核数、Driver内存、并行度;4、Shuffle调优:优化缓冲区大小、压缩参数、排序机制;5、缓存调优:合理选择缓存级别,复用数据集,及时释放缓存;6、数据预处理:前置过滤、减少字段投影,避免全量数据计算。2、Spark并行度如何设置?默认并行度问题Spark默认并行度由集群配置决定,默认值偏低,极易导致并行度不足、任务跑不满集群资源。并行度核心原则:最终Task数量=分区数量,并行度决定任务执行速度。生产配置:一般设置并行度为集群核心数的2~3倍,避免资源闲置。可以通过spark.default.parallelism配置全局并行度,也可以用repartition、coalesce动态调整分区数。注意:并行度不宜过大,分区过多会产生大量小Task,任务启动和调度开销会抵消并行计算优势。3、Spark常见OOM原因及解决方案1、DriverOOM:大多是collect、take等算子拉取大量数据到Driver端,导致内存溢出。解决方案:避免大批量数据拉取到Driver,结果落地文件/数据库,增大Driver内存。2、ExecutorOOM:核心原因是数据倾斜、单分区数据量过大、未预聚合、缓存数据过多。解决方案:解决数据倾斜、开启Map预聚合、优化分区、合理设置缓存级别。3、ShuffleOOM:Shuffle缓冲区不足、数据量过大。解决方案:增大Shuffle内存比例、开启Shuffle压缩、优化Shuffle排序参数。六、Spark架构与运行模式面试题1、Spark核心组件及各自职责1、Driver:任务调度核心,解析代码、构建DAG、切割Stage、调度Task、汇总结果、响应客户端。2、Executor:运行在Worker节点的进程,负责执行具体Task、存储缓存数据、提供线程池资源。3、ClusterManager:资源管理器,负责分配集群资源,支持Yarn、Standalone、K8s。4、Worker:Standalone模式下的从节点进程,负责管理本节点资源、启动Executor。2、SparkYarn两种模式的区别(client/cluster)YarnClient模式:Driver运行在客户端机器上,客户端断开连接,任务就会终止。适合测试、调试任务,可以实时查看日志。生产环境基本不用。YarnCluster模式:Driver运行在Yarn集群的NodeManager节点上,客户端提交任务后即可断开,任务在集群后台运行,稳定可靠,是生产环境唯一使用的模式。七、Spark容错与异常面试题1、Spark的容错机制是什么?Spark核心容错机制是RDD血缘容错。RDD不可变、只读,且存在完整的依赖血缘关系。当某个分区Task执行失败、节点宕机、数据丢失时,Spark不需要重算整个任务,只需要根据RDD血缘,重新计算丢失的分区数据即可,容错开销极低。如果是缓存数据丢失,直接根据上游RDD重新计算缓存,保证任务正常执行。2、Task失败和Stage失败的原因Task失败:数据倾斜、单分区数据量过大、内存不足、数据格式异常、节点网络波动、脏数据。Stage失败:Shuffle数据丢失、大量Task批量失败、资源不足、集群节点故障、任务参数配置错误。八、SparkSQL核心面试题1、SparkSQL、HiveQL的关系?SparkSQL是Spark处理结构化数据的组件,兼容大部分HiveQL语法,可以直接读取Hiv

温馨提示

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

评论

0/150

提交评论