Spark之内存管理MemoryManager及统一内存管理源码分析

本文深入分析Spark的MemoryManager,重点讲解UnifiedMemoryManager的内存管理机制,包括统一内存管理的图解、初始化源码、Execution和Storage内存的申请源码。讨论了相关参数如spark.memory.offHeap.size、spark.memory.fraction等,并指出UnifiedMemoryManager如何更好地利用内存,与StaticMemoryManager的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark MemoryManager

1.MemoryManager接口

1.1.概述

在Spark中,MemoryManager接口定义了Storage内存和Execution内存统一管理分配的公共方法。包括堆内以及堆外内存。

1.2.相关成员

// 堆内Storage内存池
protected val onHeapStorageMemoryPool = new StorageMemoryPool(this, MemoryMode.ON_HEAP)
// 堆外Storage内存池 
protected val offHeapStorageMemoryPool = new StorageMemoryPool(this, MemoryMode.OFF_HEAP)
// 堆内Execution内存池 
protected val onHeapExecutionMemoryPool = new ExecutionMemoryPool(this, MemoryMode.ON_HEAP)
// 堆外Storage内存池
protected val offHeapExecutionMemoryPool = new ExecutionMemoryPool(this, MemoryMode.OFF_HEAP)

// 设置 onHeapStorageMemoryPool 大小为 onHeapStorageMemory
onHeapStorageMemoryPool.incrementPoolSize(onHeapStorageMemory)
// 设置 onHeapExecutionMemoryPool 大小为 onHeapExecutionMemory
onHeapExecutionMemoryPool.incrementPoolSize(onHeapExecutionMemory)

// 获取参数 spark.memory.offHeap.size 的值,即设置的堆外内存大小(默认值为0)
protected[this] val maxOffHeapMemory = conf.get(MEMORY_OFFHEAP_SIZE)
// 获取参数 spark.memory.storageFraction 的比值,即堆外内存中 Stroage 内存堆占比
protected[this] val offHeapStorageMemory =
    (maxOffHeapMemory * conf.get(MEMORY_STORAGE_FRACTION)).toLong

// 设置堆外 offHeapExecutionMemoryPool 大小为 最大堆外内存 - 堆外 StorageMemory
offHeapExecutionMemoryPool.incrementPoolSize(maxOffHeapMemory - offHeapStorageMemory)
// 设置堆外 storageMemoryPool 大小为 offHeapStorageMemory
offHeapStorageMemoryPool.incrementPoolSize(offHeapStorageMemory)

至于堆内内存onHeapStorageMemory和onHeapExecutionMemory这两个参数的大小值,与其具体实现MemoryManager的实现类有关系。可参见接下来的UnifiedMemoryManager实现。

其中,参数spark.memory.offHeap.enabled用来制定是否使用堆外内存,默认是false,即不开启。

1.3.内存池MemoryPool接口

该接口定义了内存池的相关公共方法,Storage内存池StorageMemoryPool和Execution内存池ExecutionMemoryPool都继承自该接口。

该接口主要方法:

// 返回内存池大小
final def poolSize: Long
// 返回可用内存池大小
final def memoryFree: Long
// 扩大内存池大小
final def incrementPoolSize(delta: Long): Unit
// 缩小内存池大小
final def decrementPoolSize(delta: Long): Unit 
// 返回内存池当前的使用量
def memoryUsed: Long

1.4.内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值