|NO.Z.00103|——————————|BigDataEnd|——|Hadoop&Spark.V01|——|Spark.v01|Spark 原理 源码|内存管理&堆内内存与堆外内存|
一、内存管理
### --- 内存管理
~~~ 在执行 Spark 的应用程序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 进程:
~~~ Driver为主控进程,负责创建 Spark 上下文,提交 Spark 作业,将作业转化为 Task,
~~~ 并在各个 Executor 进程间协调任务的调度
~~~ Executor负责在工作节点上执行具体的计算任务,并将结果返回给 Driver,
~~~ 同时为需要持久化的 RDD 提供存储功能
~~~ Driver 的内存管理(缺省值 1G)相对来说较为简单,
~~~ 这里主要针对 Executor 的内存管理进行分析,下文中提到的Spark 内存均特指 Executor 的内存。
二、堆内内存与堆外内存
### --- 堆内内存与堆外内存
### --- 堆内内存与堆外内存架构说明
~~~ 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,
~~~ Spark 对JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存。
~~~ 同时,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,
~~~ 进一步优化了内存的使用。
~~~ 堆内内存受到 JVM 统一管理,堆外内存是直接向操作系统进行内存的申请和释放。

三、堆内内存
### --- 堆内内存
~~~ 堆内内存的大小,
~~~ 由 Spark 应用程序启动时的 executor-memory 或 spark.executor.memory 参数配置。
~~~ Executor内运行的并发任务共享 JVM 堆内内存。
~~~ 缓存 RDD 数据和广播变量占用的内存被规划为存储内存
~~~ 执行 Shuffle 时占用的内存被规划为执行内存
~~~ Spark 内部的对象实例,或者用户定义的 Spark 应用程序中的对象实例,均占用剩余的空间
~~~ Spark 对堆内内存的管理是一种逻辑上 ”规划式” 的管理,
~~~ 因为对象实例占用内存的申请和释放都由 JVM 完成,Spark只能在申请后和释放前记录这些内存。
~~~ 虽然不能精准控制堆内内存的申请和释放,
~~~ 但 Spark 通过对存储内存和执行内存各自独立的规划管理,
~~~ 可以决定是否要在存储内存里缓存新的 RDD,以及是否为新的任务分配执行内存,
~~~ 在一定程度上可以提升内存的利用率,减少异常的出现。
四、堆外内存
### --- 堆外内存
~~~ 为了进一步优化内存的使用以及提高 Shuffle 时排序的效率,
~~~ Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,
~~~ 存储经过序列化的二进制数据。
~~~ 堆外内存意味着把内存对象分配在 Java 虚拟机的堆以外的内存,这些内存直接受操作系统管理。
~~~ 这样做的结果就是能保持一个较小的堆,以减少垃圾收集对应用的影响。
~~~ 利用 JDK Unsafe API,Spark 可以直接操作系统堆外内存,减少了不必要的内存开销,
~~~ 以及频繁的 GC 扫描和回收,提升了处理性能。
~~~ 堆外内存可以被精确地申请和释放(堆外内存之所以能够被精确的申请和释放,
~~~ 是由于内存的申请和释放不再通过 JVM 机制,而是直接向操作系统申请,
~~~ JVM 对于内存的清理是无法准确指定时间点的,因此无法实现精确的释放),
~~~ 而且序列化的数据占用的空间可以被精确计算,所以相比堆内内存来说降低了管理的难度,
~~~ 也降低了误差。
~~~ 在默认情况下堆外内存并不启用,可通过配置 spark.memory.offHeap.enabled 参数启用,
~~~ 并由spark.memory.offHeap.size 参数设定堆外空间的大小。
~~~ 除了没有 other 空间,堆外内存与堆内内存的划分方式相同,
~~~ 所有运行中的并发任务共享 存储内存 和 执行内存 。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv018-spark.v03
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」