版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spark面试题及详细答案(实战完整版)一、Spark基础核心面试题1、简单说说Spark和MapReduce的核心区别?这是大数据面试高频基础题,核心差异集中在运行效率、计算模型、容错和使用场景上:第一,计算模型不同。MapReduce是基于磁盘的离线计算,每一个Map、Reduce阶段结束后都会强制落地磁盘,IO开销极大;Spark是基于内存的分布式计算引擎,默认优先内存缓存数据,中间计算结果不需要频繁落盘,迭代计算效率提升非常明显。第二,任务调度机制不同。MapReduce是硬性的两阶段模型,只能按照Map→Reduce流程执行,复杂任务需要编写多个Job串联;Spark基于DAG有向无环图调度,能自动拆分宽窄依赖,优化任务执行链路,支持复杂迭代计算。第三,容错机制不同。MapReduce靠磁盘数据容错,失败后重新读取磁盘数据重试;Spark基于RDD血缘容错,只需要重算出错的分区任务,不需要全量重跑。第四,场景适配不同。MapReduce只适合简单的海量离线批处理;Spark兼顾离线批处理、实时计算、交互式查询、机器学习等多种场景。2、什么是RDD?RDD的五大特性是什么?RDD是Spark的核心抽象,全称弹性分布式数据集,是一个只读、可分区、可并行计算的数据集合,也是Spark所有计算的基础。五大核心特性:1.分区列表:RDD的数据被拆分成多个分区,分布在集群不同节点,分区是Spark并行计算的最小单位;2.分区计算函数:每个分区都会执行统一的计算逻辑,由算子定义,实现分区数据的转换处理;3.依赖关系:每个RDD都会记录对上一级RDD的依赖,也就是血缘关系,用于任务容错和重试;4.分区器(可选):仅键值对类型的RDD有,用于控制数据分区规则,比如Hash分区、Range分区;5.优先位置列表(可选):记录每个分区的最优计算节点,遵循数据本地化原则,减少数据网络传输。3、RDD的两种算子区别:Transformation和Action?这是Spark执行机制的核心,两者最大的区别是惰性执行特性:Transformation(转换算子):属于懒执行,调用后不会立即执行任务,只会记录RDD的转换血缘关系,生成DAG图,不会产生实际计算和数据输出。常见算子:map、flatMap、filter、reduceByKey、join、groupByKey等。且大部分转换算子是不可变、只读的。Action(行动算子):触发SparkJob真正执行的算子,一旦调用,会根据DAG拆分Stage、提交任务、执行计算并输出结果。常见算子:count、collect、first、take、saveAsTextFile、foreach等。简单总结:转换算子攒任务,行动算子跑任务。4、什么是宽窄依赖?划分Stage的依据是什么?窄依赖:子RDD的每一个分区,只依赖父RDD的一个分区。算子执行时无需洗牌,分区数据独立计算,效率高。常见算子:map、filter、flatMap、union。窄依赖可以在同一个Stage内执行。宽依赖(洗牌依赖):子RDD的一个分区,依赖父RDD的多个分区,会触发Shuffle数据洗牌,需要跨节点传输数据,开销大。常见算子:groupByKey、reduceByKey、join、distinct。宽依赖是Stage划分的边界。Stage划分规则:Spark以宽依赖为边界拆分Stage,一个Job从后往前遍历DAG,遇到宽依赖就切分一个新Stage。一个Stage内部包含连续的窄依赖算子,保证尽可能多的任务流水线执行,减少Shuffle次数。二、Spark核心运行原理面试题1、Spark集群运行架构及角色职责?Spark标准分布式架构为「主从架构」,核心四个角色,日常工作最常用的是Standalone、YARN两种部署模式,角色职责基本一致:1.Driver(驱动器):运行在客户端或集群节点,负责解析用户代码、生成DAG、划分Stage、生成Task,向资源管理器申请资源,调度和监控所有任务执行,汇总最终结果。2.Master/ResourceManager(主节点):集群资源管理者,负责整体资源调度、分配Worker节点资源,接收Driver的资源申请。Standalone模式为Master,YARN模式为ResourceManager。3.Worker/NodeManager(从节点):集群工作节点,负责管理本机内存、CPU资源,接收Master指令,启动和管理Executor。Standalone模式为Worker,YARN模式为NodeManager。4.Executor(执行器):运行在Worker节点的进程,是真正执行Task的容器。负责执行Driver分发的Task,存储RDD缓存数据,每个Executor包含多个线程,并行执行多个Task。2、Spark任务提交后完整执行流程?(面试必背)1.客户端通过spark-submit提交任务,启动Driver进程,加载用户编写的Spark代码;2.Driver初始化SparkContext,解析代码中的所有算子,构建RDD依赖关系,生成完整DAG图;3.DAG调度器根据宽依赖拆分Stage,每个Stage生成对应的Task集合;4.Driver向集群资源管理器申请Executor资源(CPU、内存);5.资源管理器分配节点资源,启动对应Executor进程,并反向注册到Driver;6.Driver将Task分发到各个Executor的空闲线程中执行;7.Executor执行分区任务,中间数据按需缓存,遇到Shuffle则完成跨节点数据拉取聚合;8.所有Task执行完成后,Driver汇总结果,关闭资源,任务结束。3、Task、Stage、Job的三者关系?1.Job:一个Action算子对应一个Job,是用户视角的完整任务;2.Stage:一个Job会根据宽依赖拆分成多个Stage,Stage串行执行,从上一个Stage结束后再执行下一个;3.Task:一个Stage包含多个Task,Task数量等于该Stage最后一个RDD的分区数,同一个Stage的所有Task并行执行。层级关系:Job>Stage>Task三、Spark数据倾斜面试题(重中之重)1、什么是数据倾斜?数据倾斜的现象和原因?数据倾斜定义:Shuffle过程中,部分分区分配的数据量远超其他分区,导致少数Task数据量极大、执行极慢,大部分Task快速跑完,整体任务卡在个别慢Task上,甚至OOM报错。核心现象:任务执行进度卡在90%、99%长时间不动;部分Task耗时几十分钟,其余Task几秒完成;日志出现内存溢出、GC频繁等问题。常见原因:1.业务数据本身不均衡,比如大量空值、默认值、热点key(如日志数据中的未知设备、默认用户ID);2.join、groupBy、distinct等Shuffle算子使用不当,相同key数据过度集中;3.分区规则不合理,Hash分区对特殊key分配不均。2、日常解决数据倾斜的常用方案?(实操回答)根据倾斜场景从简单到复杂排序,都是工作中常用的方案:1.预处理过滤倾斜key(最优方案)如果是空值、无效热点key导致的倾斜,直接在数据读取后先filter过滤掉无效数据,从根源解决,零开销。2.两阶段聚合解决groupBy/聚合倾斜对分组聚合倾斜,先给key拼接随机前缀,打散数据做局部聚合,再去掉随机前缀做全局聚合,均匀分散分区数据量。3.大表小表join倾斜:广播join一张大表、一张小表join出现倾斜时,放弃默认Shufflejoin,使用broadcast广播小表,避免Shuffle过程,彻底杜绝倾斜。4.拆分倾斜key单独处理针对少数热点key,单独过滤出来单独计算,非倾斜key正常计算,最后合并两部分结果,适合热点key数量少的场景。5.调整分区数、开启自适应执行高版本Spark可开启自适应执行参数,自动优化分区、自动处理轻度数据倾斜,适合轻微倾斜场景。四、Spark缓存与调优面试题1、Spark常用缓存级别及区别?默认缓存级别是什么?Spark缓存通过persist()、cache()方法实现,cache()是persist()的简写,默认级别是MEMORY_ONLY。常用核心级别:1.MEMORY_ONLY:仅内存缓存,内存不足直接丢弃分区数据,使用时重算;2.MEMORY_AND_DISK:优先缓存内存,内存不够将溢出数据落地磁盘,最常用、最稳妥的级别;3.MEMORY_ONLY_SER:数据序列化后存入内存,节省内存空间,读取会有序列化开销;4.MEMORY_AND_DISK_SER:序列化存储,内存不足落盘,适合大数据量缓存;5.DISK_ONLY:仅磁盘缓存,几乎不使用,效率极低。2、什么时候需要缓存RDD?缓存的注意事项?适用场景:1.一个RDD被多次复用(多次Action、多次join、多次迭代计算);2.迭代计算任务(机器学习、循环聚合),重复计算开销极大;3.中间结果计算耗时久,重算成本高的核心数据集。注意事项:1.一次性使用的RDD不要缓存,占用内存、浪费资源;2.缓存后手动调用unpersist()释放资源,避免长期占用集群内存;3.大数据量优先使用序列化缓存级别,防止内存溢出。3、Spark日常调优的核心方向?工作中调优主要围绕资源、Shuffle、数据、代码四个方向:1.资源参数调优:合理设置Executor内存、核心数、分区数,避免资源过剩或不足;分区数一般设置为集群核心数的2-3倍。2.Shuffle调优:调整Shuffle缓冲区大小、磁盘溢出阈值,开启Shuffle压缩,减少网络和IO开销。3.代码逻辑调优:提前过滤数据、减少大字段传输、避免重复计算、优先使用窄依赖算子,少用低效算子(groupByKey优先替换为reduceByKey)。4.缓存与执行调优:合理缓存复用数据、开启自适应执行、广播小表,规避数据倾斜。五、SparkSQL核心面试题1、SparkSQL的执行流程?1.接收SQL语句,经过语法解析,生成抽象语法树;2.语义分析,校验表名、字段名、权限,绑定元数据;3.逻辑优化:自动执行谓词下推、列裁剪、常量折叠等优化,提前过滤数据、减少数据加载;4.物理计划生成:将优化后的逻辑计划,转为Spark可执行的物理算子;5.生成RDDDAG,拆分Stage、Task,提交集群执行。2、join常见的几种方式及适用场景?1.BroadcastJoin(广播连接):小表广播到所有节点,无Shuffle,速度最快。适用于一大一小两张表关联,小表数据量远小于内存阈值。2.ShuffleHashJoin:默认join方式,两张大表关联,通过Shuffle洗牌分区后关联,开销较高。3.SortMergeJoin:Spark默认大表关联最优方式,先排序再合并关联,适合超大规模两张表join,稳定性高。3、谓词下推是什么?为什么要开启?谓词下推是SparkSQL的核心优化机制,简单说就是将过滤条件尽可能下推到数据源读取阶段。比如执行join后过滤的语句,优化器会自动将过滤条件提前到表读取阶段,先过滤无效数据,再做关联、聚合计算。大幅减少加载、传输、计算的数据量,极大提升任务效率,是Spark核心优化手段,默认开启。六、Spark故障排查与实战面试题1、Spark任务常见OOM内存溢出原因及解决?常见原因:1.数据倾斜导致单个Task处理数据量过大;2.collect、take等算子将大量集群数据拉取到Driver端,导致DriverOOM;3.缓存数据过多、未及时释放,占用大量Executor内存;4.分区数过少,单个分区数据量超标。解决方案:1.处理数据倾斜,打散热点key、使用广播join;2.禁止大规模数据collect到Driver,分批处理数据;3.增加分区数,拆分单Task数据量;4.清理无用缓存,合理调整内存参数。2、Spark任务执行慢,排查思路是什么?1.先看任务进度和Task运行时间,判断是否存在数据倾斜、个别慢任务;2.查看Stage执行耗时,定位是Shuffle耗时、计算耗时还是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 市场开发战略磋商函(6篇)
- 2026年市场推广活动时间节点确认函(6篇)范文
- 汽车零部件质量控制与生产标准手册
- 办公环境优化五项建议与执行方案
- 《求一个数是另一个数的几倍》教案
- 人教版八年级上册地理第五章第二节《环境保护与发展》教学课件(新教材)
- 智能制造设备维护周期规划指南
- 人教版(新教材)八年级地理第八章第二节《“鱼米之乡”-长江三角洲地区》练习题课件
- 理财平台理财产品查询指南
- 2026年师范类院校美术教学技能冲刺模拟试卷
- 高考语文复习:文言文选择题
- 2026及未来5年中国BOPA薄膜行业市场全景调研及发展前景研判报告
- 眼科编码课件
- 2025年10月自考07729仓储技术和库存理论试题及答案
- 金蝶软件销售合同范本
- 电疗操作知识培训内容总结课件
- 雕刻机设计论文
- 新疆宗教史课件
- 中医适宜技术在妇科的应用课件
- 成都纺织高等专科学校招聘笔试真题2024
- 人民检察院办案工作区设置和使用管理规定
评论
0/150
提交评论