jvm内存模型
- 堆内存on-heap:
- 堆外内存(非堆)(off-heap),默认为堆*0.1
- 直接内存:jvm外内存(native内存)DirectByteBuffer
- 栈、方法区、程序计数器等
spark内存模型
- 堆内存on-heap
- 执行内存(最大)((堆-预留内存) * spark.memory.fraction(0.6) * (1-spark.memory.storageFraction(0.5)))。主要用于存放 Shuffle、Join、Sort、Aggregation 等计算过程中的临时数据
- 存储内存(最小)((堆-预留内存) * spark.memory.fraction(0.6) * spark.memory.storageFraction(0.5))。主要用于存储 spark 的 cache 数据,例如RDD的缓存、unroll数据
- 用户内存((堆-预留内存) * (1-spark.memory.fraction))。主要用于存储 RDD 转换操作所需要的数据,例如 RDD 依赖等信息
- 预留内存(300M):系统预留内存,会用来存储Spark内部对象
- 堆外内存off-heap
注意:spark内存:执行内存+存储内存+用户内存
spark yarn内存模型
- yarn.nodemanager.resource.memory-mb:164
- Container(spark-executor)
- 堆内存
- spark.yarn.executor.memoryOverhedad:堆外内存
- Container(spark-executor)
spark内存管理
- 执行内存和存储内存,共享一个内存区域(M)
- 执行内存:shuffles, joins, sorts and aggregations等操作使用内存
- 用户内存:用户定义的数据结构或spark内部元数据
- 不使用执行内存时,存储过程可获得所有可用内存。
- 不使用存储内存时,执行过程可获得所有可用内存。
- 如果有必要,执行过程会驱逐存储内存,但只有M的内存使用率下降到某个阈值(R),才执行此操作。
- executor上jvm堆内存(D):M=D0.6(spark.memory.fraction) 数据结构占用内存=D0.4 spark.memory.fraction=0.6
- spark.memory.storageFraction=0.5:表示R=M0.5,即最少0.5M的内存用于存储内存
案例
(1)任务启动7个container(4G),1个AM(2G),计算使用内存
410247 + 210241 = 30720(30208)
堆外(410240.1)= 410M
堆内存 = container内存 - 堆外内存 = 41024 - 410 =3686
spark内存 = (堆内存-300M) * 0.6 = 2.03(2.1实际)
(2)任务启动10个container(4G),1个AM(2G),memoryOverhead=2000M计算使用内存
4102410 + 210241 + 200010(堆外) = 63008(64000)
堆外 = 2000M
堆内存 = container内存 = 41024 - 410 =3686
spark内存 = (堆内存-300M) * 0.6 =2.03 (2.1实际)
(3)任务启动10个container(6G),1个AM(2G),memoryOverhead=2000M计算使用内存
6102410 + 210241 + 200010(堆外) = 83488(84480)
堆外 = 2000M
堆内存 = container内存 = 6*1024 - 614 =5530
spark内存 = (堆内存-300M) * 0.6 =3.14 (3.2实际)