加入收藏 | 设为首页 | 会员中心 | 我要投稿 葫芦岛站长网 (https://www.0429zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

静态内存管理详解

发布时间:2021-05-01 15:23:58 所属栏目:评论 来源:互联网
导读:于shuffle聚合内存,取决于joins,sorts,aggregations等过程中频繁的IO需要的Buffer临时数据存储。 简单来说,spark在shuffle write的过程中,每个executor会将数据写到该executor的物理磁盘上,下一个stage的task会去上一个stage拉取其需要处理的数据,并且

于shuffle聚合内存,取决于joins,sorts,aggregations等过程中频繁的IO需要的Buffer临时数据存储。

简单来说,spark在shuffle write的过程中,每个executor会将数据写到该executor的物理磁盘上,下一个stage的task会去上一个stage拉取其需要处理的数据,并且是边拉取边进行处理的(和MapReduce的拉取合并数据基本一样),这个时候会用一个aggregate的数据结构,比如hashmap边拉取数据边进行聚合。这部分内存就被称做execution内存。

从getMaxExecutironMemory方法可知,每个executor分配给execution的内存为:Execution Memory = systemMaxMemory *memoryFraction(默认0.2) * safetyFraction(默认0.8), 默认为 executor ***可用内存 * 0.16。tion内存在运行时会被分配给运行在JVM上的task。这里不同的是,分配给每个task的内存并不是固定的,而是动态的。spark不是一上来就分配固定大小的内存块给task,而是允许一个task占据JVM所有execution内存。

每个JVM上的task可以最多申请至多1/N的execution内存(N为active task的个数,由spark.executor.cores指定)。如果task的申请没有被批准,它会释放一部分内存,并且下次申请的时候,它会申请更小的一部分内存。

注意:为了防止过多的spilling(evict)数据,只有当一个task分配到的内存达到execution内存1/(2N)的时候才会spill, 如果目前空闲的内存达不到1/(2N)的时候, 内存申请会被阻塞直到其他的taskspill掉它们的内存。如果不这样限制,假设当前有一个任务占据了绝大部分内存,那么新来的task会一直往硬盘spill数据,这样就会导致比较严重的I/O问题。

举个例子, 某executor先启动一个task A,并在task B启动前快速占用了所有可用内存。(B启动后)N变成2,task B会阻塞直到task A spill,自己可获得1/(2N)=1/4的execution内存。而一旦task B获取到了1/4的内存,A和B就都有可能spill了。

预留内存

Spark之所以有一个SafetyFraction这样的参数,是为了避免潜在的OOM。例如,进行计算时,有一个提前未预料到的比较大的数据,会导致计算时间延长甚至OOM, safetyFraction为storage和execution 都提供了额外的buffer以防止此类的数据倾斜。这部分内存叫做预留内存。

四 Storage内存

可用的Storage内存

该部分内存用作对RDD的缓存(如调用cache,persist等方法),节点间传输的广播变量。

(编辑:葫芦岛站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读