spark 基础问题面试题

以下是 Spark 基础面试题的全面梳理,涵盖核心概念、架构原理和编程模型,帮助快速掌握高频考点:


一、核心概念

1. Spark 核心组件
组件作用
Driver执行 main() 方法,调度任务,管理集群资源
Executor在 Worker 节点执行 Task,缓存数据
Cluster Manager管理集群资源(YARN/Mesos/Standalone)
RDD分布式数据集的抽象(弹性、不可变、可分区的集合)
2. RDD 五大特性

图表

代码

  • 分区(Partitions)、依赖(Dependencies)、计算函数(Compute)、分区器(Partitioner)、首选位置(Preferred Locations)

3. 宽窄依赖
类型特点例子
窄依赖1个父RDD分区 → 1个子RDD分区map()filter()
宽依赖1个父RDD分区 → N个子RDD分区(需Shuffle)groupByKey()reduceByKey()

二、执行流程

4. Spark 任务提交流程
  1. Driver 创建 SparkContext

  2. 向 Cluster Manager 申请资源

  3. Cluster Manager 启动 Executor

  4. Driver 将 DAG 拆分为 Task

  5. Executor 执行 Task 并返回结果

5. Stage 划分原理
  • 触发条件:遇到宽依赖(Shuffle)时切割 Stage

  • Stage 类型

    • ShuffleMapStage:输出 Shuffle 数据

    • ResultStage:执行 Action 算子(如 count()collect()

6. Shuffle 过程

图表

代码

  • 优化点:减少数据传输量(reduceByKey > groupByKey


三、编程模型

7. Transformation vs Action
类型特点例子
Transformation惰性执行,生成新RDDmap()filter()join()
Action触发Job执行,返回结果count()saveAsTextFile()collect()
8. 持久化方法对比
方法存储级别是否保留血缘
cache()MEMORY_ONLY保留
persist()可指定(如 MEMORY_AND_DISK保留
checkpoint()可靠存储(HDFS)切断血缘
9. 广播变量 vs 累加器
特性广播变量累加器
用途只读共享大变量分布式计数器
修改权限Executor 只读Executor 累加,Driver 读取
场景字典表、配置参数统计异常记录数

四、部署与资源

10. 部署模式对比
模式特点适用场景
Local单机多线程调试开发测试
StandaloneSpark自带资源调度中小规模集群
YARN集成Hadoop资源管理生产环境(主流)
Kubernetes容器化部署云原生架构
11. 资源参数配置

bash

spark-submit \--master yarn \--num-executors 10 \       # Executor数量--executor-cores 4 \       # 每个Executor的CPU核数--executor-memory 8g \     # 每个Executor的内存--driver-memory 2g         # Driver内存

五、高频考点

12. RDD vs DataFrame vs Dataset
特性RDDDataFrameDataset
类型安全
优化能力Catalyst优化器支持支持
序列化Java序列化Tungsten二进制格式Tungsten二进制格式
13. Spark SQL 执行流程
  1. 将 SQL 解析为逻辑计划

  2. Catalyst 优化器进行规则优化(谓词下推、列裁剪)

  3. 生成物理计划并执行

14. 常见算子作用
  • coalesce():减少分区数(无Shuffle)

  • repartition():调整分区数(触发Shuffle)

  • sample():数据采样

  • union():合并两个RDD(不去重)


六、故障排查基础

15. OOM(内存溢出)原因
  • Driver OOM:collect() 拉取数据过多

  • Executor OOM:

    • 数据倾斜导致单Task负载过高

    • persist() 缓存数据超出内存

16. Shuffle Fetch Failed 错误
  • 原因:Executor 宕机或 GC 超时

  • 解决:增加超时时间 spark.network.timeout=300s


附:基础代码示例

scala

// 创建RDD
val rdd = sc.parallelize(List(1, 2, 3, 4, 5))// Transformation: 过滤偶数
val evenRDD = rdd.filter(_ % 2 == 0)// Action: 计数并打印
println(evenRDD.count())  // 输出: 2// 广播变量使用
val broadcastVar = sc.broadcast(Map("a" -> 1, "b" -> 2))
rdd.map(x => broadcastVar.value.getOrElse(x.toString, 0)).collect()

💡 面试技巧

  1. 被问及概念时,先给出定义,再说明应用场景(如:”宽依赖在Shuffle时发生,典型场景是groupByKey“)

  2. 遇到原理题,结合流程图描述(如DAG划分、Shuffle过程)

  3. 牢记核心参数作用(如 num-executorsexecutor-cores

spark 面试题

以下是针对Spark面试的核心知识点梳理及高频考题解析,结合企业实际需求和性能调优经验整理而成,助你系统准备:


一、核心概念与架构

  1. Spark vs MapReduce 效率对比

    • 内存计算:中间数据优先内存存储,减少磁盘I/O(MapReduce需落盘)14

    • DAG调度:将任务拆解为有向无环图,优化执行路径;MapReduce仅两阶段(Map+Reduce)38

    • 容错机制:RDD血缘(Lineage)自动恢复丢失数据;MapReduce需任务重跑16

  2. RDD(弹性分布式数据集)

    • 五大特性

      • 分区容错(自动分区恢复)

      • 血缘追溯(Lineage重建丢失数据)

      • 存储弹性(内存不足时自动溢写磁盘)

      • 计算弹性(Task/Stage自动重试)

      • 分片弹性(动态调整分区数)28

    • 缺陷:不支持细粒度更新(如单条记录修改),仅适合批处理8

  3. 部署模式

    模式特点适用场景
    Local单机多线程调试,无集群资源管理开发测试
    StandaloneSpark自带资源调度,Master单点故障需ZK支持中小集群
    YARN资源由YARN管理,支持Cluster(生产)和Client(调试)模式Hadoop生态集成
    Mesos细粒度资源分配(按需调度),但配置复杂动态资源场景68

二、调度与执行机制

  1. Stage划分原理

    • 宽窄依赖

      • 窄依赖(Narrow):1父分区 → 1子分区(如mapfilter),同Stage内流水线执行

      • 宽依赖(Wide):1父分区 → N子分区(如groupByKey),需Shuffle并划分新Stage23

    • 划分算法:从Action算子反向回溯,遇宽依赖则切割Stage4

  2. Shuffle机制详解

    • 过程

      • Shuffle Write:Map端按Key分区,排序后溢写磁盘文件

      • Shuffle Read:Reduce端拉取数据,聚合后计算38

    • 优化

      • 避免groupByKey → 改用reduceByKey(Map端预聚合)

      • 调整分区数:spark.sql.shuffle.partitions(默认200,按数据量调优)78

  3. 内存管理

    • 统一内存模型(Unified Memory)

      • Execution内存(计算):Shuffle/Join等临时数据

      • Storage内存(存储):缓存RDD数据

      • 两者可动态抢占,避免OOM6

    • 调参spark.memory.fraction(默认0.6,总JVM内存占比)8


三、性能优化实战

  1. 数据倾斜解决

    • 现象:个别Task耗时远高于其他

    • 方案

      • 两阶段聚合:加随机前缀局部聚合 → 全局聚合

      • 热点Key分离:单独处理或使用salting(添加随机后缀)

      • 开启倾斜处理spark.sql.adaptive.skewedJoin.enabled=true(Spark 3.0+)47

  2. 算子选择原则

    • 优先reduceByKey > groupByKey(减少Shuffle数据量)

    • mapPartitions替代map(减少函数调用开销)

    • 避免collect()全量拉数据 → 改用take(N)或输出到存储系统7

  3. 持久化策略

    机制存储位置血缘保留适用场景
    cache/persist内存/磁盘保留频繁访问的中间RDD
    checkpointHDFS等可靠存储切断长血缘依赖的容错恢复34

四、容错与高级特性

  1. Master HA实现

    • ZooKeeper存储:Application、Worker、Driver元数据2

    • 主备切换:不影响运行中任务(Driver与Executor直连)24

  2. 广播变量与累加器

    • 广播变量:只读缓存大对象(如字典表),避免Task重复传输7

    • 累加器:分布式计数器(如统计异常记录数),仅Driver可读1

  3. Spark Streaming容错

    • Checkpoint:定时保存DStream血缘及元数据至HDFS

    • WAL预写日志:接收数据后先写日志再处理4


五、编程实践与SQL优化

  1. Spark SQL性能优势

    • Catalyst优化器:逻辑计划优化(谓词下推、列裁剪)

    • Tungsten引擎:堆外内存管理 + 代码生成5

  2. DataFrame vs SQL

    • DataFrame优势

      • 编译时类型安全

      • 链式调用优化更友好

      • 支持DSL复杂操作4

  3. 典型代码示例

    scala

    // WordCount实现
    val textFile = sc.textFile("hdfs://path/to/file")
    val counts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
    counts.saveAsTextFile("hdfs://output")// TopN获取(按频次降序)
    val topN = counts.map(_.swap).sortByKey(false).take(N)

附:高频扩展题

  1. 解释coalescerepartition区别?(coalesce无Shuffle缩分区,repartition强制Shuffle)7

  2. 为何Executor会Full GC?(堆内存不足或对象未释放;调大spark.executor.memoryOverhead)6

  3. Spark on YARN下Container如何复用?(Yarn Container不支持复用,每次任务启动新Container)8

💡 提示:面试中常结合场景深度追问(如“百亿数据JOIN如何优化?”),建议准备1-2个调优实战案例,重点说明问题定位→解决策略→效果量化(如:“两阶段聚合解决数据倾斜,耗时从2小时降至20分钟”)。

spark 性能调优面试题

以下是 Spark 性能调优的高频面试题及深度解析,涵盖原理、实战场景和解决方案,帮助你在面试中展现调优思维:


一、核心调优方向

1. 数据倾斜(Data Skew)
  • 问题现象:少数 Task 处理时间远超其他 Task(如 99% Task 1min 完成,1个 Task 卡 1h)。

  • 解决方案

    • 加盐打散:对热点 Key 添加随机前缀(concat(key, '_', rand()%10)),先局部聚合再全局聚合。

    scala

    // 第一阶段:加盐局部聚合
    val saltedRDD = rdd.map(key => (s"${key}_${Random.nextInt(10)}", 1))
    val partialAgg = saltedRDD.reduceByKey(_ + _)// 第二阶段:去盐全局聚合
    val restoredRDD = partialAgg.map{ case (saltedKey, count) => val key = saltedKey.split("_")(0)(key, count)
    }
    val finalResult = restoredRDD.reduceByKey(_ + _)
    • 分离热点数据:单独处理热点 Key(filter 拆分 → 分别计算 → union)。

    • 开启 AQE(Spark 3.0+):spark.sql.adaptive.skewedJoin.enabled=true 自动拆分倾斜分区。

2. Shuffle 优化
  • 核心问题:Shuffle 写磁盘 + 网络传输是最大瓶颈。

  • 调优手段

    • 减少 Shuffle 数据量

      • 避免 groupByKey → 改用 reduceByKey(Map 端预聚合)。

      • 使用 broadcast join 替代 shuffle join(小表 < 10MB)。

    • 调整分区数

      • 合理设置 spark.sql.shuffle.partitions(默认200,建议:集群核数*2~4)。

      • 动态分区:spark.sql.adaptive.enabled=true(AQE 自动合并小分区)。

    • 选择 Shuffle 管理器

      • SortShuffleManager(默认,支持压缩) > HashShuffleManager(易 OOM)。

3. 内存管理
  • 堆内存结构

    图表

  • 关键参数

    参数作用推荐值
    spark.executor.memoryExecutor 总内存根据集群调整
    spark.memory.fractionExecution+Storage 占比0.6~0.8
    spark.storage.memoryFractionStorage 内存占比0.3~0.5
  • OOM 解决

    • 增加 spark.executor.memoryOverhead(堆外内存,默认 executor-memory * 0.1)。


二、执行效率优化

4. 执行计划优化
  • 查看执行计划

    scala

    df.explain("extended")  // 展示逻辑/物理计划
  • Catalyst 优化器生效点

    • 谓词下推(Predicate Pushdown):提前过滤数据。

    • 列裁剪(Column Pruning):仅读取必要列。

  • 强制广播spark.sql.autoBroadcastJoinThreshold=10485760(10MB)。

5. 资源并行度
  • 黄金公式

    text

    总并行度 = Executor 数 * 每个 Executor 的 core 数
  • 参数配置

    参数说明优化建议
    spark.executor.instancesExecutor 数量根据数据量调整
    spark.executor.cores每个 Executor 的 CPU 核数4~8
    spark.default.parallelismRDD 默认分区数设为总 core 数 2~3 倍
6. 数据读写优化
  • 输入数据

    • 优先使用 Parquet/ORC(列式存储 + 谓词下推)。

    • 避免小文件:spark.sql.files.maxPartitionBytes=128MB(合并小文件)。

  • 输出数据

    • 用 coalesce 减少输出文件数(无 Shuffle)。

    • 禁用生成 _SUCCESS 文件:spark.hadoop.mapreduce.fileoutputcommitter.marksuccessfuljobs=false


三、高级调优技巧

7. Join 优化策略
Join 类型适用场景调优手段
Broadcast Join小表 + 大表自动触发或手动 hint
Sort Merge Join大表 + 大表确保分区有序
Bucket Join预分桶表创建分桶表 CLUSTERED BY
8. 序列化优化
  • Kryo 序列化

    scala

    spark.conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
    spark.conf.registerKryoClasses(Array(classOf[MyClass]))
  • 效果:比 Java 序列化快 10 倍,体积小 50%。

9. AQE(自适应查询执行)
  • Spark 3.0+ 核心特性

    scala

    spark.sql("SET spark.sql.adaptive.enabled=true")
  • 功能

    • 动态合并小分区(Coalesce Shuffle Partitions)。

    • 倾斜 Join 自动优化(Optimize Skewed Join)。

    • 运行时调整 Join 策略(Demote BroadcastHashJoin)。


四、故障排查实战题

10. 慢 Task 定位
  • 步骤

    1. 查看 Spark UI 定位慢 Task 所在 Stage。

    2. 检查该 Task 的 GC 时间(是否频繁 Full GC)。

    3. 分析输入数据量(是否数据倾斜)。

  • 工具

    • spark.eventLog.enabled=true 记录日志。

    • 使用 Spark History Server 离线分析。

11. Shuffle Fetch Failed
  • 错误原因

    • Executor 宕机导致 Shuffle 数据丢失。

    • GC 停顿超时(默认 60s)。

  • 解决方案

    • 增加超时:spark.network.timeout=300s

    • 减少 GC:切 G1 垃圾回收器。

    bash

    --conf "spark.executor.extraJavaOptions=-XX:+UseG1GC"

调优思维回答模板

面试官:”如果遇到 Spark 作业运行缓慢,你会如何排查?“

回答框架

  1. 定位瓶颈:通过 Spark UI 分析 Stage/Task 耗时,确认是 Shuffle、计算还是 IO 问题。

  2. 数据倾斜检查:观察 Task 数据分布,用 df.stat.approxQuantile 检测 Key 分布。

  3. 内存分析:检查 GC 日志,调整内存比例或切 G1 回收器。

  4. 优化执行:启用 AQE、广播小表、避免 collect 全量拉取。

  5. 资源调整:根据数据量动态增加 Executor 或 core 数。

  6. 案例佐证:”曾优化某 Join 作业,通过广播表+AQE 倾斜处理,从 2h 降至 20min“。

掌握这些核心点,你将能系统性应对 90% 的 Spark 调优面试问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94690.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94690.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94690.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的DML增删改操作:

目录 添加数据&#xff1a; 方式1&#xff1a;一条一条添加数据&#xff1a; 方式2&#xff1a;将查询结果插入到表中&#xff1a; 更新数据&#xff1a; 删除数据&#xff1a; MySQL8的新特性&#xff1a;计算列&#xff1a; 本文介绍了MySQL数据库操作语言(DML)的基本使…

MySQL运维常用语法速查

&#x1f5c3;️ 一、数据库操作 CREATE DATABASE db_name; USE db_name; DROP DATABASE db_name; SHOW DATABASES;&#x1f517; 官方文档 &#x1f4ca; 二、表操作 表创建示例 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,email V…

汽车以太网通信协议——SOME/IP

1. 背景 SOME/IP是一种汽车中间件解决方案&#xff0c;其全称是Scalable Service-Oriented Middleware over IP&#xff0c;即位于 IP 协议层以上的一种面向服务的可扩展的中间件。 中间件&#xff1a;该术语起源于复杂的软件系统开发&#xff0c;用以实现软件组件之间的数据交…

什么是负载均衡,有哪些常见算法?

文章目录1.什么是负载均衡2.负载均衡的分类2.1 二层负载均衡2.2 三层负载均衡2.3 四层负载均衡2.4 七层负载均衡3.负载均衡工具3.1 LVS3.2 Nginx3.3 HAProxy4.常见负载均衡算法5.面试回答模板1.什么是负载均衡 为了提升web应用的各方面能力&#xff0c;我们一般会把多台机器组…

PyTorch 核心三件套:Tensor、Module、Autograd

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录引言1 Tensor1.1 &#x1f6e0;️Tensor 的核心用…

python源码是如何运行起来的

为什么要了解底层原理 写出高质量代码 问题定位 满足好奇心 机械通感 开始 当我们编写并运行一行 print(Hello, World!) 时&#xff0c;背后究竟发生了什么&#xff1f;Python 代码是如何从我们可读的文本&#xff0c;变成计算机可以执行的指令的呢&#xff1f; 很多人将…

MacOS Docker 安装指南

MacOS Docker 安装指南 引言 Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。Docker …

Cisco 3750X交换机更新到IOS 15.2后无法启动 提示:Boot process failed...

背景及故障现象 一台新购入的二手Cisco 3750X-48P&#xff0c;原机自带IOS软件版本为12.x&#xff0c;可以正常工作。 但将IOS版本升级到15.2之后&#xff0c;在启动过程中卡住。 第一次加载IOS软件时是正常的&#xff0c;提示&#xff1a; Loading "flash:/c3750e-uni…

Redis Redis 常见数据类型

Redis 提供了 5 种数据结构&#xff0c;理解每种数据结构的特点对于 Redis 开发运维非常重要&#xff0c;同时掌握每种数据结构的常见命令&#xff0c;会在使用 Redis 的时候做到游刃有余。 一、预备知识 官方文档&#xff1a;Commands | Docs (redis.io) 1、最核心的两个命令…

金融风控实战:Spring Boot + LightGBM 贷款预测模型服务化(超详细版)

金融风控实战&#xff1a;Spring Boot LightGBM 贷款预测模型服务化&#xff08;超详细版&#xff09;一、整体架构设计二、模型训练与优化1. 特征工程&#xff08;Python&#xff09;2. 模型评估与优化三、Spring Boot 服务实现1. 项目结构2. ONNX 模型服务3. 特征工程服务4.…

前端学习 7:EDA 工具

目录 EDA 工具 Design Ware Synopsys CoreTools 套件 VCS verdi Design Compiler EDA 工具 常用的EDA工具主要来自三家公司&#xff1a;Synopsys、Cadence和Mentor&#xff08;已被Siemens收购&#xff09;。EDA&#xff0c;全称电子设计自动化&#xff08;Electronics …

windows有一个企业微信安装包,脚本执行并安装到d盘。

以下是将本地已有的企业微信安装包安装到D盘的完整PowerShell脚本&#xff0c;包含详细的错误处理和进度反馈&#xff1a; <# .SYNOPSIS使用本地企业微信安装包安装到D盘 .DESCRIPTION自动检测本地安装包&#xff0c;静默安装到指定目录支持.exe和.msi格式安装包 #># 强制…

[LVGL] 布局系统 lv_flex, lv_grid | 输入设备 lv_indev | union

第五章&#xff1a;布局系统&#xff08;lv_flex, lv_grid&#xff09; 欢迎回来&#xff01; 在第四章&#xff1a;样式&#xff08;lv_style&#xff09;中&#xff0c;我们掌握了如何通过色彩、字体和圆角等特性美化部件。当界面元素具备视觉吸引力后&#xff0c;如何优雅…

Linux中的mkdir命令

基本语法mkdir 命令的基本语法如下&#xff1a;mkdir [选项] 目录名创建单个目录要创建一个新目录&#xff0c;只需在 mkdir 后跟上目录名称。例如&#xff1a;mkdir new_folder这会在当前工作目录下创建一个名为 new_folder 的目录。创建多个目录可以一次性创建多个目录&#…

基于大数据的美食视频播放数据可视化系统 Python+Django+Vue.js

本文项目编号 25003 &#xff0c;文末自助获取源码 \color{red}{25003&#xff0c;文末自助获取源码} 25003&#xff0c;文末自助获取源码 目录 一、系统介绍二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询数据6.2 新…

微信小程序精品项目-基于springboot+Android的计算机精品课程学习系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

(五)系统可靠性设计

2024年博主考软考高级系统架构师没通过&#xff0c;于是决定集中精力认真学习系统架构的每一个环节&#xff0c;并在2025年软考中取得了不错的成绩&#xff0c;虽然做信息安全的考架构师很难&#xff0c;但找对方法&#xff0c;问题就不大&#xff01; 本文主要是博主在学习过程…

Shuffle SOAR使用学习经验

Shuffle SOAR 1. 基础操作与配置1.1 环境搭建与系统要求1.1.1 硬件与操作系统要求Shuffle SOAR 平台作为一款开源的安全编排、自动化与响应&#xff08;SOAR&#xff09;工具&#xff0c;其部署方式灵活&#xff0c;支持云端和自托管两种模式。对于自托管部署&#xff0c;官方推…

腾讯云 EdgeOne 产品分析与免费套餐体验指南

本文围绕腾讯云 EdgeOne 展开&#xff0c;全方位介绍它的核心能力、免费套餐内容&#xff0c;以及如何快速上手、监控和排查常见问题&#xff0c;帮助个人开发者和中小企业在不产生额外成本的前提下体验高性能的边缘加速与安全防护。 一、产品概述 EdgeOne 定位 一体化云服务平…

npm ERR! Unsupported URL Type “workspace:“: workspace:./lib

如下 npm install npm ERR! code EUNSUPPORTEDPROTOCOL npm ERR! Unsupported URL Type "workspace:": workspace:./libnpm ERR! A complete log of this run can be found in: D:\IDEA\nodejs\node_cache\_logs\2025-08-06T08_21_32_592Z-debug-0.log原因及解决 pac…