Spark内存模型在1.6版本之前版本采用的是静态管理(Static Memory Manager)的方式,在1.6之后采用的是统一管理(Unified Memory Manager)的方式。且Spark的可用内存分为堆内和堆外,由于堆外的比较简单,所以本文会对统一管理方式的情况进行讲解。
Spark 1.6 之后引入了统一内存管理机制,该机制与静态内存管理的区别在于,存储内存(Storage)和执行内存(Execution)是共享一块内存空间的,双方可以互相占用对方的空闲区域。
一、堆内
统一内存管理(堆内)图示如下(各个模块的作用这里就不说啦,上篇文章有写):
统一内存管理机制是为了针对静态内存管理机制中“一半海水,一半火焰”而做的优化,那么下面来讲讲存储内存和执行内存互相占用 的规则:
- 若双方空间都不足时,则都flush到磁盘中
- 若自己空间不足,但是对方有空闲空间,那么可以借用对方的空间
- 若Execution内存被Storage占用后,可以叫Storage将数据flush到磁盘,然后归还空间
- 若Storage空间被Execution空间占用后,无法让该空间归还给Storage,因为这个涉及到shuffle的很多因素,很复杂
二、堆外
由于堆外的内存空间也是分为存储内存(Storage)和执行内存(Execution),互相占用的规则和堆内的是一致的
统一内存管理(堆外)图示如下:
注:本文的内容和图片摘取于:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/index.html