堆内核堆外内存:
堆内内存
- 指的是我们启动程序后,指的参数列表就是堆内内存(--executor-memory)
- 堆内内存分为:存储内存、执行内存、其他内存
- executor内task共享executor的堆内内存
- 堆内内存的大小,有Spark应用程序起订时的-executor-memory或spark.executor.memeory参数配置。
- JVM负责收回分配,spark只是记录内存对象是否被释放和估算对象的大小,但是真正的回收是JVM负责,所以Spark并不能准确记录实际可用的堆内内存。
堆外内存
- 堆外内存分为:存储内存、执行内存
- worker内多个executor的多task共享堆外内存
- 在默认情况下堆外内存并不启用,可通过配置spark.memory.offHeap.enabled参数启用,并由spark.memory.offHeap.size参数设定堆外空间的大小
内存管理接口
- Spark为存储内存和执行内存的管理提供了统一的接口——MemroyManager,同一个Executor内的任何都调用这个接口的方法来申请或释放内存:
- 内存管理接口的主要方法:
//申请存储内存
Spark版本划分1.6和2.x以上版本将内存管理分为两大类:
静态内存管理模型
- 如果当程序启动后,我们所分配的内存区域大小不可改变,并且也不可以动态占用对方未使用的内存空间。
- 堆内
- 存储内存:内存空间占用60%,在内部内存当中,会预留出10%防止OOM内存溢出
- 执行内存:内存空间占用20%,在内部内存当中,会预留出20%防止OOM内存溢出
- 其他内存:内存空间占用20%
- 堆外
- 存储内存:占用总的内存的50%
- 执行内存:占用总的内存的50%
统一内存管理模型
- 与静态内存管理的区别在于存储内存和执行内存共享同一块空间叫做统一内存,可以动态占用对方的空闲区域(动态占用机制)
- 堆内
- 统一内存:占用总内存的60%,内部分为存储内存和执行内存,各占用50%
- 其他内存:占用总内存的40%
- 预留内存:固定大小300M
- 堆外
- 统一内存:50%
- 其它内存:50%
- 动态占用机制
- 如果存储内存和执行内的空间都不足,此时会将数据落盘,如果当我们的执行内存空间有剩余,此时内存空间不足,就会占用执行内存空间,那么如果发生计算,使用执行内存空间,存内存占用的空间要归还给执行内存,那么这一部分归还的内存的数据就会淘汰(当我们换成级别设置为内存存储的话,这部分数据就会被删除,如果内存加磁盘的话,就落盘),如果执行内存占用了存储内存,当存储内存,当存储内存空间不足,有新的存储数据进来,此时执行内存不会归还内存,这部分数据就要启动淘汰机制(将老的数据删除或落盘,取决于你的存储级别),总结来说,执行内存级别高于内存级别。