1:MemoryManager
org.apache.spark.memory.MemoryManager
spark为存储内存和执行内存的管理提供了统一的接口–MemoryManager,同一个Executor内的任务都调用这个接口的方法来申请或释放内存。
—>进入后Ctr + H 查看实现类:
StaticMemoryManager:
执行内存和存储内存相互之间不能占用
UnifiedMemoryManager:
执行内存和存储内存相互之间能占用
内存管理接口:
申请存储内存
def acquireStorageMemory(blockId: BlockId, numBytes: Long, memoryMode: MemoryMode): Boolean
申请展开内存
def acquireUnrollMemory(blockId: BlockId, numBytes: Long, memoryMode: MemoryMode): Boolean
申请执行内存
def acquireExecutionMemory(numBytes: Long,taskAttemptId: Long, memoryMode: MemoryMode): Long
释放执行内存
def releaseExecutionMemory( numBytes: Long, taskAttemptId: Long,memoryMode: MemoryMode): Unit
释放存储内存
def releaseStorageMemory(numBytes: Long, memoryMode: MemoryMode): Unit
释放展开内存
def releaseUnrollMemory(numBytes: Long, memoryMode: MemoryMode): Unit
3个申请内存的,3个是释放内存的方法,就是对申请到的总内存进行一种逻辑上的管理规划。
堆外内存和堆内内存是真实存在的一个内存区域。执行内存和存储内存,都是堆内和堆外内存的一个逻辑区的概念。通过每个区域的上限来隔离。
2:内存空间分配
(1)静态内存管理
c
可用堆内内存空间
可用的存储内存 = systemMaxMemory * spark.storage.memoryFraction * spark.storage.safetyFraction
可用的执行内存 = systemMaxMemory * spark.shuffle.memoryFraction * spark.shuffle.safetyFraction
静态内存管理图示——堆外
(2)统一内存管理
统一内存管理图示——堆内
统一内存管理图示——堆外
spark.memoryoffHeap.enable(默认值false,没有堆外内存),启用改为true。
spark.memory.userLegacyMode(默认值为false,使用统一内存管理)改为true表示启用静态内存管理;若要使用静态内存管理还得配置的参数有:spark.shuffle.memoryFraction、spark.storage.memoryFraction、spark.storage.unrollFraction。
3:内存管理宏观概述