Spark统一内存管理:UnifiedMemoryManager

@DT大数据梦工厂

Spark统一内存管理:UnifiedMemoryManager,内存管理图:

Spark静态内存管理:StaticMemoryManager请看:http://blog.csdn.net/aijiudu/article/details/77885953

一、统一内存管理:Execution和Storage之间是软边界,任一方都可以从另一方借用内存。Execution和Storage之间共享的区域是通过`spark.memory.fraction`(1.6.2默认为0.75,2.2默认值0.6)配置的,大小是:(HeapSize-300MB)*0.75。 该空间内的边界的位置由`spark.memory.storageFraction`(默认为0.5)进一步确定。 这意味着默认情况下,存储区的大小为0.75* 0.5 = 0.375的堆空间。

  存储可以借用尽可能多的执行内存,直到执行回收其空间。 当发生这种情况时,缓存的块将被释放到内存中,直到释放足够的借用内存以满足执行存储器请求。 类似地,执行可以借用尽可能多的存储空间。然而,由于执行此操作涉及复杂性,执行内存不会因存储而被驱逐。 这意味着,如果执行已经占用了大部分存储空间,那么尝试缓存块可能会失败,在这种情况下,新块将根据各自的存储级别去降级存储,例如Memory。

二、Spark1.6.x及当下2.1和2.2新型的JVMHeap分为三大部分:ReservedMemory(默认300M,但是必须是其1.5倍,所以最低要450M内存保留空间)、UserMemory、SparkMemory。

1、ReservedMemory 系统运行的时候至少Heap的大小为300M* 1.5 = 450M一般本地开发建议至少2G。(默认300M,但是必须是其1.5倍,所以最低要450M内存保留空间)

2、UserMemory:从Spark的程序讲什么是user的空间呢?什么时候会接触到user的空间,我们是基于RDD编程,它使用的是什么空间呢?

其实是在RDD的具体实现的方法中肯定会写自己的代码,代码处理逻辑,作用RDD的数据,你可能要使用一个数据结构,例如MapPartitions,处理一个partition假如有5000条数据,5000个records,在这个过程中肯定会有中间的临时数据,这些数据实际上讲和Spark本身是不太相关的,这只是作为开发者为了处理数据引入了中间数据,这些数据是不是存储在SparkMemory的StorageMemory呢?

是不是???为什么???

你自己维护的数据结构是不是会导致OOM???一定要对RDD以外的自己维护的一些数据结构足够重视。

用户主导的空间主要就是,用户自己在写Map算子flatMap算子,或者Aggregate操作的时候,会产生中间数据,这时候产生的中间数据就在UserMemory中。

UserMemory什么时候出现OOM???

例如有4G大小,那么默认情况下UserMemory大小是:(4G-300M)*25% = 949M,在Stage内部Task角度讲,Task本身运行的是时候,Task中的所有的算子在运行的时候,展开的每一个RDD算子的内部,从4G的角度,它中间的数据最大使用的空间不能超过949M。如果工程师使用例如MapPartitions等一个Task内的所有算子使用的数据空间的大小大于949M(UserMemory内存)的时候就会出现OOM。

4、SparkMemory是Spark程序在运行系统框架主导使用的空间。编程的时候关注两方面的内容,框架的本身和自己管理的空间。

StorageMemory相当于旧版的Storage,而ExecutionMemory相当于旧版本的Shuffle。在旧版本中Storage占了54%的Heap空间,而Shuffle占了14.4%的Heap空间。

现在版本中Storage和Shuffle其实采用”Unified”的方式共同使用(HeapSize -300)*75%,默认情况下Storage和Execution各占该空间的50%。Storage中会负责Persist、Unroll及Broadcast的数据,

ExecutionMemory是在ShuffleTask运行的角度来看的,Task是运行在线程之上的。

5、“UnifiedMemory”

第一:意StorageMemory和ExecutionMemory在适当的时候可以借用彼此的Momroy;

第二点:当Execution空间不足而且Storage空间也不足的时候,Storage空间会被强制drop掉一部分数据来弥补Execution的空间不足问题,hopefully。两个空间都不足时,这时候就放弃一Storage空间,来进行Execution,能执行起来优先级最高。

Execution向Storage借用空间的两种情况,第一是Storage曾经向Execution借了空间,然后Execution又不需要那么大的空间,如果Execution不足了就向管理器发信号强制drop掉Storage占用的超过50%部分的数据drop掉,但是剩下的Storage还占用了的那部分空间,Execution要用是有限度的。

第二种情况:当Storage使用不足50%的时候,Execution可以使用Storage的空间,当Execution有剩余空间的时候Storage可以找Execution借用空间,如果没有剩余空间Storage是不能借的,而且Execution已经占用了其和Storage公用的80%的空间的时候,这个时候Storage要用空间,不能把Execution多占的30%的空间回收使用。

所有Task的运行都是ShuffleTask的运行!

如下ExecutionMemoryPoolmemoryForTask是一个HashMap,记录Task在运行的时候怎么使用内存。方便管理和统计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值