前提
从spark3.0开始没有静态管理了,只有个统一内存管理
onHeap:java虚拟机管理的内存是堆内内存
offHeap:java虚拟机管理之外的内存,系统内存是堆外内存
堆内内存(on-heap memory)
- Execution 内存:主要用于存放 Shuffle、Join、Sort、Aggregation 等计算过程中的临时数据
- Storage 内存:主要用于存储 spark 的 cache 数据,例如RDD的缓存、unroll数据;
- 用户内存(User Memory):主要用于存储 RDD 转换操作所需要的数据,例如 RDD 依赖等信息。
- 预留内存(Reserved Memory):系统预留内存,会用来存储Spark内部对象。
堆外内存 (off-heap memory)
通过spark.memory.offHeap.enabled 启动堆外内存,
并通过spark.memory.offHeap.size
设置堆外内存大小,单位为字节
动态占用机制
1.当空间都沾满后,溢写到磁盘
2.storage占用了execution,execution需要用,storage占用对方的内存可直接淘汰。所以正常情况下,会有数据的丢失
3.当execution占用storage,需要归还时,需等待execution。 storage根据存储级别是溢写磁盘还是淘汰数据