Spark内存管理机制

a.      Spark静态内存管理

在Spark 1.5版本及以前,Spark采用静态内存管理模型。对于一个Executor,对应的JVM Heap内存主要由三个独立的区块组成,如图所示。

静态内存管理

Storage Memory。这片内存区域是为了解决对RDD进行的Cache缓存(通过程序中调用rdd.cache,rdd.persist等方法),还有节点间传输的广播变量Broadcasts,以及任务结果Task results等的存储。

memoryFraction是StorageMemory占整个systemMaxMemory内存的比例,由参数spark.storage.memoryFraction(默认值0.6)来设定。同时为了避免出现OOM的情况,会设定一个安全系数spark.storage.safetyFraction(默认值0.9)。

Execution Memory。这片内存区域是为了解决shuffles,joins,sorts and aggregations 过程中为了避免频繁IO需要的Buffer临时数据的存储。

memoryFraction即ExecutionMemory占所有能使用内存的百分比,由参数spark.shuffle.memoryFraction(默认值0.2)来确定。safetyFraction是execution部分的一个安全阈值,由参数spark.shuffle.safetyFraction(默认值0.8)来确定。

Other Memory。这片内存区域是给系统预留的内存,包括程序本身运行所需的内存。(默认值0.2)。

总结起来,如果不引入safety的话,整个executor内存的60%用于storage,20%用于execution,剩下20%用于其他。在引入safetyFraction后,默认情况下storage占了整个executor内存的54%,execution占了16%,那么最终还剩下30%内存用于其他用途。

对于静态内存管理模型,StorageMemory和Execution Memory的内存空间都是静态配置,相互之间不可逾越。在可控内存区块,一旦达到配置上限,内存中的数据会被spill至磁盘。而storage区块的数据(在StorageLevel配置为Memory_Only)甚至会被抛弃。不论哪种情况,都会导致IO或重算,造成性能下降。

b.      Spark统一内存管理

从Spark 1.6版本推出以后,Spark采用了统一内存管理模型。通过spark.memory.useLegacyMode配置,可以控制选择的内存管理器实例。默认情况下此值为false,即选择UnifiedMemoryManager实例。在统一内存管理下,Spark一个executor的JVM Heap内存主要分成了三大部分,如图所示。

统一内存管理

Reserved Memory。这片区域的内存是Spark内部保留内存,会存储一些spark的内部对象等内容,也是我们无法使用的部分。Spark 1.6默认的Reserved Memory大小是300MB(可以通过spark.testing.reservedMemory配置得到),在为executor申请内存后,这300MB是我们无法使用的。并且如果我们申请的executor的大小小于1.5 * Reserved Memory  < 450MBSpark将会报出错误。

User Memory。这个区域的内存是用户在程序中开的对象存储等一系列非Spark管理的内存开销所占用的内存(默认值为(JVM Heap Size - Reserved Memory) * (1-spark.memory.fraction))。

Spark Memory。这个区域的内存是用于Spark管理的内存开销。主要分成了两个部分,Execution Memory和Storage Memory,通过spark.memory.storageFraction来配置两块各占的大小(默认值0.5)。

(1)      Storage Memory。主要用来存储我们Cache的数据和临时空间序列化时Unroll的数据,以及Broadcast变量Cache级别存储的内容。

(2)      Execution Memory。主要用来存储Spark Task执行时使用的内存(比如Shuffle时排序所需要的临时存储空间)。

为了提高内存利用率,Spark统一内存管理模型针对StorageMemory 和 Execution Memory有如下策略:

(1)  一方空闲,一方内存不足情况下,内存不足一方可以向空闲一方借用内存。

(2)   Execution Memory可以强制拿回StorageMemory在Execution Memory空闲时,借用的Execution Memory的部分内存(强制取回,而Storage Memory数据丢失,重新计算即可)。

(3)  Storage Memory只能等待Execution Memory主动释放占用的StorageMemory空闲时的内存(不强制取回,因为如果task执行,数据丢失就会导致task 失败)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值