Spark内存管理分为静态内存管理和统一内存管理,Spark1.6之前使用的是静态内存管理,Spark1.6之后的版本默认使用的是统一内存管理。
动态内存机制图:
内存估算:
Other Memory = 自定义数据结构*每个 Executor 核数
解:Other Memory基本很简单,就是根据自定义的Map、List * executor-cores = ?
Storage Memory = 广播变量 + cache/Executor 数量
设:数据100GB、num-executors = 10、广播+cache = 1GB
解:Storage Memory : 1GB + 100GB / 10 = Executor >= 11GB
Executor Memory = 每个 Executor 核数 * (数据集大小/并行度Task)
设:数据100GB、executor-cores = 4 ,num-executors 1,并行度默认200
解:Executor Memory: 4 *(100G/(200/1)) = 2GB
动态内存占用机制:
1. 设置内存的初始值,即Execution和Storage均需设定各自的内存区域范围(默认参数0.5)
2. 若存在一方内存不足,另一方内存空余时,可占用对方内存空间
3. 双方内存均不足时,需落盘处理
4. Execution内存被占用时,Storage需将此部分转存硬盘并归还空间
5. Storage内存被占用时,Execution无需归还