这课解决什么:别再对 Spark OOM 抓瞎
很多写 Spark 的同学都有过这种经历:作业跑着跑着突然挂掉,控制台抛出一堆内存溢出的异常,上网搜一圈,得到的答案往往是“调大 executor.memory”或者加几个配置参数。这种做法偶尔管用,但只要数据量再涨一点,问题又会复现。根本原因在于,你并不清楚 Spark 底层到底是怎么把内存切分给各个任务和算子的。这门课只讲一件事:Spark 2.x 的 Memory Manager 是如何划分、申请、释放内存的。它不教你写 SQL 或调 RDD 算子,而是直接带你扎进执行内存与存储内存的博弈细节里。如果你每次遇到性能瓶颈或内存报错都只能靠玄学试错,那说明你正好缺这一块底层原理的补位。它把平时隐藏在引擎黑盒里的内存分配机制拆开给你看,让你从“只会用”变成“能看透”。
能力缺口与建议先看的重点
这门课适合有一定 Spark 实际编码经验、能独立写离线批处理作业,但没读过内核源码的技术人员。如果你连 RDD 的基本转换和行动操作都还没搞明白,建议先去补基础再来听这门课,否则你会觉得各个内存块的名字非常抽象。对于符合基础要求的同学,建议按以下顺序切入:先看静态内存模型,理解早期版本把执行内存和存储内存按比例硬隔离的做法;再看统一内存模型,搞懂两者如何共享同一块空间以及互相借调的边界条件。这两块是理解后续原理的基石。接着重点啃透单个 Task 内存分配以及一个 Task 内多操作并发的分配逻辑。很多人平时看 Spark UI 时,根本看不懂 Task 级别的内存指标,就是因为不知道一个 Task 在运行时到底占的是哪块池子、不够用时怎么向其他池子借。把这些分配逻辑彻底搞懂,你才算真正补齐了内核机制的短板。
配套练习与学完应能回答的问题
听课的时候不要干瞪眼,资料包里的视频进度必须配合本地源码追踪和实操来消化。建议在本地跑一个包含多个 Shuffle 操作的作业,故意把内存调小,然后打开 Spark Web UI 的 Executors 页面,对照着视频里讲的逻辑去观察内存变化。学完这门课后,你应该能独立回答并解决以下几个问题:执行内存和存储内存的边界在哪,什么情况下存储内存会被强制逐出?堆外内存到底省在哪里,它的分配受什么参数控制?当一个 Task 里有多个聚合或排序操作时,它们是怎么瓜分那点可怜的执行内存的?如果发生 OOM,你能直接根据报错定位到是哪一块内存不够,而不是盲目地给机器加内存。带着这些问题去回看课程目录里的各个章节,把每一个分配机制都对应到你自己跑过的作业日志上,这门课才算没白听。
课程目录
1 课程内容 (14:28) 2 静态内存模型 (10:26) 3 统一内存模型 (11:26) 4 off_heap内存的管理 (07:58) 5 每一个task需要内存的分配 (05:19) 6 一个task中多个操作需要内存的分配 (06:38)
![[老汤]Spark 2.x内核原理二之内存管理(Memory Manager)视频课程](/_next/image?url=https%3A%2F%2Fwww.itzhibei.com%2Fapi%2Fuploads%2F3bcbb760-39c7-4970-90ac-82ffb3a342c7.jpg&w=1920&q=75)




