概要
Spark被称作内存计算引擎,使得很多初学者认为Spark运行环境一定需要大量内存,更有甚者,认为Spark运行期会把原始数据一次性全部加载到内存。解开这些疑团,需要了解Spark运行时的机制,Spark的计算发生在Executor,因此,这里的运行时机制是指Executor的行为。
对于Spark运行时机制,先从内存管理入手,了解这部分,对于Spark调优也大有裨益,Spark开发中很常见的问题是OOM和full gc pause导致的假死现象,特别是在Spark1.6之前的版本中,很可能会因为不熟悉内存管理导致大量内存运行时被闲置而浪费,这个问题在1.6中引入了新的内存管理器UnifiedMemoryManager而得到优化。
相关概念
内存管理对应的接口为MemoryManager,但Executor使用TaskMemoryManager和MemoryStore间接调用MemoryManager管理内存,涉及到的相关概念如下
概念 | 作用 |
MemoryManager | 管理CoarseGrainedExecutorBackend进程的内存(即Executor),其将内存主要划分为storage、execution和other三部分。CoarseGrainedExecutorBackend上运行的Task共享这部分内存 |
TaskMemoryManager | 内部使用MemoryManager,管理所有Task的execution这部分内存 |
MemoryStore | 主要作用为管理内存中的block,即管理storage这部分内存 |
MemoryPool | 用于记录storage、execution内存的使用情况,对应子类分别为StorageMemoryPool、ExecutionMemoryPool |
StaticMemoryManager | spark 1.6之前的内存管理器,静态内存管理器,这里的静态是指storage、execution内存的占比及界限是固定的。 |
UnifiedMemoryManager | spark 1.6新加入的内存管理器,统一资源管理器,和StaticMemoryManager最大不同之处在于,storage、execution内存界限不是固定的,可以互相借用 |
MemoryManager
MemoryManager负责管理内存,查看其定义
从上图中可以到内存有on-heap、off-heap之分,后续介绍,其UML如下
从上图可以得到如下信息
- MemoryManager的方法主要功能是管理内存,acquire*和release*。
- 从方法名判断,MemoryManager将内存分为了storage、execution、unroll三部分管理,下面会进一步介绍。
- 有三个配置是和Tungsten相关,Tungsten是spark执行引擎有史以来最大的改动,以榨干性能为己任。具体是关于ON_HEAP和OFF_HEAP的,如下
内存划分
根据上面对MemoryManager分析,MemoryManager将内存分为如下几部分
各部分对应的功能如下
名称 | 作用 |
Storage | 用于cache block,保存broadcast数据,以及发送large task result |
Unroll | Unroll占用的是Storage的内存,Unroll是指 BlockManager收到iterator形式的数据,最终存放到内存的过程 |
Execution | 保存shuffles、 joins、sorts 、aggregations等操作的中间数据 |
other | 剩余的部分,用于class以及spark中的元数据等开销 |
上面各部分所占比例由内存管理器实现类StaticMemoryManager、UnifiedMemoryManager确定。
on-heap、off-heap
Execution的内存有两种管理方式on-heap、off-heap,如下
名称 | 作用 |
on-heap | 使用JVM管理对象 |
off-heap[tungsten memory相关优化] | 手动管理,减小JVM对象空间及gc开销 |
off-heap使用sun.misc.Unsafe API直接向OS申请释放内存,具体实现及意义会在Tungsten相关部分介绍,启用方式如下
StaticMemoryManager
Spark 内存管理之StaticMemoryManager
UnifiedMemoryManager
Spark 内存管理之UnifiedMemoryManager
Tungsten
参考:
Unified Memory Management in Spark 1.6
MEMTUNE: Dynamic Memory Management for
In-memory Data Analytic Platforms