Spark 的内存管理是内存分布式引擎中的一个重要角色,了解内存管理机制和原理,才能更好地作优化。html
静态内存管理图示——堆内git
Unroll 的源码参考:https://github.com/apache/spark/blob/branch-1.6/core/src/main/scala/org/apache/spark/storage/MemoryStore.scala#L249github
静态内存管理图示——堆外
web
统一内存管理图示——堆内
apache
统一内存管理图示——堆外
缓存
其中最重要的优化在于动态占用机制,其规则以下: 1\设定基本的存储内存和执行内存区域(spark.storage.storageFraction 参数),该设定肯定了双方各自拥有的空间的范围 双方的空间都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间;(存储空间不足是指不足以放下一个完整的 Block) 2\执行内存的空间被对方占用后,可以让对方将占用的部分转存到硬盘,而后"归还"借用的空间 3\存储内存的空间被对方占用后,没法让对方"归还",由于须要考虑 Shuffle 过程当中的不少因素,实现起来较为复杂
动态占用机制图示
session
凭借统一内存管理机制,Spark 在必定程度上提升了堆内和堆外内存资源的利用率,下降了开发者维护 Spark 内存的难度,但并不意味着开发者能够高枕无忧。譬如,因此若是存储内存的 空间太大 或者说 缓存的数据 过多,反而会致使频繁的全量垃圾回收,下降任务执行时的性能,由于缓存的 RDD 数据一般都是长期驻留内存的。因此要想充分发挥 Spark 的性能,须要开发者进一步了解存储内存和执行内存各自的管理方式和实现原理。数据结构
统一内存管理还能够简化如图
(1)Reserved Memory分布式
(2)User Memorysvg
(3)Spark Memory
静态内存管理 | 统一内存管理 | |
---|---|---|
不一样点 | 每一个区域都有预留内存,经过参数控制占比 | 只有一个预留内存区域,且该区域是单独的 |
相同点1 | 分为三个区域(Storage、Execution和 Other)+ 保留内存 | 分为3个区域(Spark Memory(包含 Storage 和 Execution) 、User Memory(Other))+保留内存 |
相同点2 | 堆内内存(Storage、Execution),堆外内存(User Memory) | 堆内内存(Spark Memory)。堆外内存(User Memory) |
选项 | spark 1.6.x以前版本 | spark 1.6.x | spark 2.1.x | spark 2.2.x | spark 2.3.x | spark 2.4.x | 备注 |
---|---|---|---|---|---|---|---|
spark.memory.fraction | 无值 | 0.75 | 0.6 | 0.6 | 0.6 | 0.6 | |
spark.memory.storageFraction | 无值 | 0.5 | 0.5 | 0.5 | 0.5 | 0.5 | |
spark.memory.offHeap.enabled | 无值 | false | false | false | false | false | |
spark.memory.offHeap.size | 无值 | 0 | 0 | 0 | 0 | 0 | |
spark.memory.useLegacyMode | 无值 | false | false | false | false | false | |
spark.shuffle.memoryFraction | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 | |
spark.storage.memoryFraction | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | 0.6 | |
spark.storage.unrollFraction | 0.2 | 0.2 | 0.6 | 0.2 | 0.2 | 0.2 | |
spark.storage.replication.proactive | 无值 | 无值 | 无值 | false | false | false | |
spark.cleaner.periodicGC.interval | 无值 | 无值 | 无值 | 无值 | 30min | 30min | |
spark.cleaner.referenceTracking | 无值 | 无值 | 无值 | 无值 | true | true | |
spark.cleaner.referenceTracking.blocking | 无值 | 无值 | 无值 | 无值 | true | true | |
spark.cleaner.referenceTracking.blocking.shuffle | 无值 | 无值 | 无值 | 无值 | false | false | |
spark.cleaner.referenceTracking.cleanCheckpoints | 无值 | 无值 | 无值 | 无值 | false | false |
一、Spark 内存:本文中均指 Executor 内存
二、本文中的分析是基于 Spark v1.6.x 版本
三、以上内容是整合参考中的文章后,结合本身的理解而编写,不免有叙述不周之处,若有发现,多多包涵、还请赐教。