Spark的内存管理研究

举报
剑指南天 发表于 2020/11/18 22:20:54 2020/11/18
【摘要】 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一部份内存挤掉.ExcutionStorage”借内存有两种方式:第一种方式是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    建议当计算比较吃内存资源的情况时,使用统一内存管理,但是如果业务逻辑需要更大的缓存空间,此时可以考虑静态内存管理


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。