Spark 内存模型

jvm内存模型

  • 堆内存on-heap:
  • 堆外内存(非堆)(off-heap),默认为堆*0.1
    • 直接内存:jvm外内存(native内存)DirectByteBuffer
    • 栈、方法区、程序计数器等

spark内存模型

  • 堆内存on-heap
    • 执行内存((堆-300M)0.60.5)
    • 存储内存((堆-300M)0.60.5)
    • 用户内存((堆-300M)*0.4)
    • 预留内存300M
  • 堆外内存off-heap
    注意:spark内存:执行内存+存储内存+用户内存

spark yarn内存模型

  • yarn.nodemanager.resource.memory-mb:164
    • Container(spark-executor)
      • 堆内存
      • spark.yarn.executor.memoryOverhedad:堆外内存

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计算使用内存
4
102410 + 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计算使用内存
6
102410 + 210241 + 200010(堆外) = 83488(84480)
堆外 = 2000M
堆内存 = container内存 = 6*1024 - 614 =5530
spark内存 = (堆内存-300M) * 0.6 =3.14 (3.2实际)

你可能感兴趣的:(Spark 内存模型)