Spark这门课期末复习,很多人刚开始都会懵:知识点太多太散,RDD、DAG、shuffle、部署、调优、SQL……好像每章都考过,又好像每章都没学透。我作为带过几届课程设计、也帮不少同学临考突击的人,把平时踩过的坑、课上反复强调的重点,加上你们最关心的那些热搜问题——Spark on YARN 为什么只有1个核、Spark 内存和 OOM、Spark 读取 Redis、数据倾斜和面试题——集中整理成一篇可以照着看的复习总结。这份内容不敢说覆盖所有学校所有考点,但至少把 Spark 课程里最核心的脉络理顺,让大家背得不那么痛苦,理解得深一点,考试时能写出真正有用的答案。
期末考试不是靠死记硬背通过的,尤其是 Spark 这种工程属性很强的课程。很多时候老师出的题并不偏,无非是把部署、调度、内存、RDD 血缘、SQL 优化这些基础概念揉到实际场景里,问你怎么排查、怎么设计、怎么选方案。下面我按“知识体系 → RDD与调度核心 → 部署与资源 → 内存与OOM → 典型案例与外部存储 → 考点问答与答题模板 → 复习与上机建议”的顺序来写。
1. 抓住 Spark 的主线,后面复习就不乱了
1.1 这门课的知识地图,先分清楚四大块
期末复习最忌讳一上来就翻书。Spark 的内容可以分成四条主线,基本上所有题目都能归到这四条线里面:
第一块是编程模型与核心抽象,即 RDD、DataFrame、Dataset 三套 API,以及 transformation 和 action 的区别。期末考试特别喜欢考 RDD 的五大特性、依赖关系、分区和并行度,还会穿插 Scala 代码补充题。
第二块是调度与执行引擎,包括 DAG 如何生成、Stage 怎么划分、宽依赖和窄依赖、shuffle 过程、task 如何分发到 executor。这一块出题通常给一个复杂算子序列,让你画出 Stage 划分图或指出发生了几次 shuffle。
第三块是平台部署与资源管理,比如 Standalone、YARN、Local 几种运行模式的区别,Spark 提交作业时有哪些参数控制 CPU、内存、实例数。从往年题目角度,这块最容易跟“spark on YARN CPU 只能用一个”这种热点排查题结合。
第四块是运行期调优与常见故障,重点是内存模型、OOM 产生的原因和排查路径、数据倾斜的处理方式,以及 Spark SQL 中 Catalyst 优化和常用调优参数。很多学校还会考 Spark 读写外部系统,比如从 Redis 读取数据、将结果写回 Redis。
这四个模块对应的考点权重并不一样,但如果你能按主线去复习,后面所有知识点都能串成一条线:用户代码先被转换成 RDD/DataFrame 的依赖图,再被 SparkContext/DAGScheduler 切成 Stage,然后由 TaskScheduler 分配到 executor 里的多个 task 并行执行,执行过程中由于结果过大、数据倾斜或资源不足产生各种问题,最后通过参数调整和代码重构解决。
1.2 复习策略上,比“看完”更重要的是“能画图”
建议复习时随手画三张图:
- 第一张是 Spark 架构图:Driver、SparkContext、DAGScheduler、TaskScheduler、Executor、Task、BlockManager 分别负责什么。
- 第二张是 RDD 依赖与 Stage 划分图:给定一段 transform 链,能标出哪些是窄依赖、哪些是宽依赖,会在哪里拆 Stage。
- 第三张是内存与资源关系图:executor 的堆内内存各部分如何划分,storage 和 execution 内存如何互相借用,vCore 和 task 之间如何对应。
这三张图能画出来,比起把定义背十遍要有效得多。下面我就按这个主线展开,把高频重点和常被忽略的细节揉进去。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从最常考的 RDD 和 DAG 开始复盘
2.1 RDD 到底是什么,为什么说它是“血统”驱动的数据抽象
RDD(Resilient Distributed Dataset)的教材定义是“弹性分布式数据集”,但考试时如果只写这一句,往往只能拿到一半分。关键在于把四个字拆开讲明白:
- “分布式”意味着数据被切分成多个 partition,每个 partition 可能存放在不同节点上。
- “数据集”意味着它本身不存数据,只存“如何从父 RDD 计算得到自己”的元信息,也就是依赖和分区函数。
- “弹性”意味着当某个 partition 丢失时,可以根据 lineage(血统)重新计算,不需要像传统分布式系统那样必须做副本备份。
- “只读”和“不可变”也是常考的隐藏属性,RDD 一旦生成,不能修改,只能通过 transformation 生成新的 RDD。
RDD 的五大特性在选择题和简答题中都极容易出现,我总结成一句记忆方式:分区、函数、依赖、分区器、首选位置。前两个保证了计算模型完整,第三个决定了容错方式,第四个和第五个影响执行性能和本地性。
有个小的记忆技巧:先记关键词“一个列表 + 一个函数”,然后从“如何切数据、如何算数据、数据丢了怎么恢复、同一个 key 怎么分区、优先在哪个节点算”这五个问题去反问自己。面试题里最喜欢问“RDD 为什么是弹性的?”,这时候要答的不是“有 lineage”,而是一整套恢复机制:窄依赖直接重算父 partition,宽依赖要保留 shuffle 中间文件以便恢复,checkpoint 可以把长血统截断,避免恢复代价过大。
2.2 宽窄依赖和 Stage 划分:DAG 为什么会在 shuffle 处断一刀
记住一个结论:几乎所有 Stage 划分的题目,只要找到算子链上的 shuffle,答案就出来一半了。
窄依赖是指父 RDD 的每个 partition 最多只被子 RDD 的一个 partition 使用,典型算子有 map、filter、union、coalesce(不产生 shuffle 时)。窄依赖不需要跨节点拉数据,多个算子可以在同一个 Stage 内流水线执行,因为父分区的数据在本地就能算完传给下一个算子。
宽依赖是指父 RDD 的一个 partition 会被子 RDD 的多个 partition 使用,也就是多对多的关系,典型算子有 groupByKey、reduceByKey、join(未优化时)、distinct、repartition。宽依赖必然产生 shuffle,也就是说数据要被拉到下游对应分区所在的节点上去。
DAGScheduler 在遇到宽依赖时会切出一个新的 Stage,上游 Stage 的数据先写到本地磁盘或内存(实际是 shuffle write),下游 Stage 再去拉取(shuffle read)。从考试层面,最经典的题目是:
text复制
