Spark的内存管理研究
Spark内存管理
关键词:Spark Static Memory Management Unified Memory Management
摘要:Spark内存管理的策略主要分为静态内存管理和统一内存管理两种,本文主要对这两种内存管理策略进行研究
Spark是基于充分利用内存的分布式计算大数据框架,其内存管理模块在spark内核中占据着非常重要的角色.内存管理模块将内存进行了细分,主要是在存储(Storage,缓存和数据传输)和执行(Execution)之间分配内存.研究Spark内存管理的机制,有助于更好地进行spark开发调优和运维.
1 静态内存管理(Static Memory Management)
1.1 堆内内存(On-heap)
在静态内存管理机制下,存储内存、执行内存和其他内存三部分的大小在Spark应用程序运行期间是固定的,用户可以在应用程序启动前进行配置.
1.2 堆外内存(Off-heap)
为了进一步优化内存的使用以及提高Shuffle时排序的效率,Spark引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,存储经过序列化的二进制数据.spark在默认情况下堆外内存并不启用,可通过配置spark.memory.offHeap.enabled=true参数启用,并由spark.memory.offHeap.size参数设定堆外空间的大小,然后可以按照下图中的比例进行内存的计算
2 统一内存管理(Unified Memory Management)
Spark1.6开始推出了联合内存的概念,意味着存储和运行内存在维持内存总和大小不变的情况下,可以动态地扩缩. 当内存不够时,可以向对方”借内存”,但前提是对方有足够的内存或者是Execution可以强制把Storage一部份内存挤掉.Excution向Storage”借内存”有两种方式:第一种方式是Storage曾经向Execution 借了的内存,当Execution需要内存空间时可以强制拿回来;第二种方式是Execution Memory不足 50% 的情况下,Storgae Memory 会把内存空间借给Execution.并且可以看出执行比存储在内存分配有更大的优先权.
3 总结
3.1 Spark的堆内内存是在程序启动是根据-executor-memory或者spark.executor.memory配置的,可以按照上面对应图中的比例参数进行内存的计算;Spark堆外内存也是在程序启动是根据spark.memory.offHeap.size配置的,同样也可以按照对应图示中的比例进行内存的计算
3.2 统一内存管理降低了用户内存管理的门槛,避免了静态内存管理在使用过程中容易出现”旱的旱死,涝的涝死”的情况,提高了内存资源的利用率
3.3 建议当计算比较吃内存资源的情况时,使用统一内存管理,但是如果业务逻辑需要更大的缓存空间,此时可以考虑静态内存管理
- 点赞
- 收藏
- 关注作者
评论(0)