Spark 内存模型

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:堆外内存

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实际)

参考文档

https://segmentfault.com/a/1190000019581726

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。