Spark统一内存管理

2019-10-25  本文已影响0人  lj72808up

前言

一. 堆内内存

默认情况下,Spark 仅仅使用了堆内内存。Executor 端的堆内内存区域大致可以分为以下四大块:

整个 Executor 端堆内内存如果用图来表示的话,可以概括如下: spark-onheap.png

其中, 图中的几个参数作如下说明:

二. 堆外内存

    Spark 1.6 开始引入了Off-heap memory(详见SPARK-11389)。这种模式不在 JVM 内申请内存,而是调用 Java 的 unsafe 相关 API 进行诸如 C 语言里面的 malloc() 直接向操作系统申请内存,由于这种方式不进过 JVM 内存管理,所以可以避免频繁的 GC,这种内存申请的缺点是必须自己编写内存申请和释放的逻辑。

三. storage内存和executor内存的动态分配

目前 Execution 内存和 Storage 内存可以互相共享的。也就是说,如果 Execution 内存不足,而 Storage 内存有空闲,那么 Execution 可以从 Storage 中申请空间;反之亦然。但关于不在需要占用的对方内存后, 是否要归还给对方有些差异:

storage被占用的内存不会被exect内存归还的, 但是execution被占用的内存, storage是可以归还给它的

具体的实现逻辑如下:

注意,上面说的借用对方的内存需要借用方和被借用方的内存类型都一样,都是堆内内存或者都是堆外内存,不存在堆内内存不够去借用堆外内存的空间。

上一篇 下一篇

猜你喜欢

热点阅读