千锋扣丁学堂大数据培训计算框架Spark之内存模型
今天千锋扣丁学堂大数据培训老师给大家分享一篇关于大数据计算框架Spark之内存模型的详细介绍,首先Executor端的内存模型,包括堆内内存(On-heapMemory)和堆外内存(Off-heapMemory),下面我们一起来看一下吧。
存管理接口(MemoryManager)
Spark为Execution内存和Storage内存的管理提供了统一的接:MemoryManager。
MemoryManager的具体实现上,Spark1.6之后默认为统一管理(UnifiedMemoryManager)方式,1.6之前采用的静态管理(StaticMemoryManager)方式仍被保留,可通过配置spark.memory.useLegacyMode参数启用。
1静态内存管理(StaticMemoryManager)
堆内空间管理
存储内存、执行内存和其他内存的大小在Spark应用程序运行期间均为固定的,但可以在应用程序启动前进行配置。
可用的Execution内存和可用的Storage内存计算公式:
可用的Execution内存=systemMaxMemory*spark.shuffle.memoryFraction*spark.shuffle.safetyFraction
可用的Storage内存=systemMaxMemory*spark.storage.memoryFraction*spark.storage.safetyFraction
systemMaxMemory取决于当前JVM堆内内存的大小,公式中的两个safetyFraction参数,其意义在于在逻辑上预留出一块保险区域,降低因实际内存超出当前预设范围而导致OOM的风险。这块逻辑上预留的区域同样由JVM管理。
图静态内存管理-堆内内存的分配
堆外空间管理
堆外只有Execution内存和Storage内存,他们的大小由spark.memory.storageFraction这个参数决定。由于堆外内存占用的空间可以被精确计算,所以无需再设定保险区域
静态内存管理-堆外内存的分配
2统一内存管理
Spark1.6之后引入的统一内存管理机制,与静态内存管理的区别在于Storage内存和Execution内存共享同一块空间,可以动态占用对方的空闲区域。
堆内内存(On-heapMemory)
堆内内存区域大致可以分为以下四类:
1)Execution内存:主要用于存放Shuffle、Join、Sort、Aggregation等计算过程中的临时数据
2)Storage内存:主要用于缓存和传播内部数据
3)Other:用户数据结构、Spark内部元数据。
4)预留内存(ReservedMemory):系统预留内存。默认是300MB。
堆内存(Off-heapMemory)
Spark1.6开始引入了Off-heapmemory(详见SPARK-11389)。这种模式不在JVM内申请内存,而是调用JavaunsafeAPI(如C语言里面的malloc())直接向操作系统申请内存,JVM不管理这部分内存,所以可以避免频繁的GC,但要自己编写内存申请和释放的逻辑。
堆外内存分为两类:Execution内存和Storage内存。
默认情况下堆外内存不启用,可以通过配置spark.memory.offHeap.enabled参数启用,通过配置spark.memory.offHeap.size参数设定堆外内存空间的大小。
如果堆外内存被启用,那么Executor内将同时存在堆内和堆外内存,Executor中的Execution内存是堆内的Execution内存和堆外的Execution内存之和,同理,Storage内存也一样。
说明
maxOffHeapMemory=spark.memory.offHeap.size
Execution内存和Storage内存动态调整
1)设定基本的Storage内存和Execution内存区域(通过spark.storage.storageFraction配置比例,默认是0.5,即各占一半)
2)Storage内存和Execution内存都不足时,则存储到硬盘;若己方空间不足而对方空余时,可借用对方的空间;(存储空间不足是指不足以放下一个完整的Block)
3)Execution内存空间被对方占用后,可让对方将占用的部分转存到硬盘,然后"归还"借用的空间
4)Storage内存空间被对方占用后,无法让对方"归还",因为实现起来较为复杂。
以上就是关于千锋扣丁学堂大数据培训计算框架Spark之内存模型的全部内容,想要了解更多关于大数据开发方面内容的小伙伴,请关注扣丁学堂大数据培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的大数据讲师为您指导,此外扣丁学堂老师精心推出的大数据视频教程定能让你快速掌握大数据从入门到精通开发实战技能。扣丁学堂大数据学习群:209080834。