Spark内存管理模型(二)—— 统一内存管理(Unified Memory Manager)

Spark内存模型在1.6版本之前版本采用的是静态管理(Static Memory Manager)的方式,在1.6之后采用的是统一管理(Unified Memory Manager)的方式。且Spark的可用内存分为堆内和堆外,由于堆外的比较简单,所以本文会对统一管理方式的情况进行讲解。

Spark 1.6 之后引入了统一内存管理机制,该机制与静态内存管理的区别在于,存储内存(Storage)和执行内存(Execution)是共享一块内存空间的,双方可以互相占用对方的空闲区域。

一、堆内

统一内存管理(堆内)图示如下(各个模块的作用这里就不说啦,上篇文章有写):
Spark内存管理模型(二)—— 统一内存管理(Unified Memory Manager)_第1张图片

统一内存管理机制是为了针对静态内存管理机制中“一半海水,一半火焰”而做的优化,那么下面来讲讲存储内存和执行内存互相占用 的规则:

  • 若双方空间都不足时,则都flush到磁盘中
  • 若自己空间不足,但是对方有空闲空间,那么可以借用对方的空间
  • 若Execution内存被Storage占用后,可以叫Storage将数据flush到磁盘,然后归还空间
  • 若Storage空间被Execution空间占用后,无法让该空间归还给Storage,因为这个涉及到shuffle的很多因素,很复杂

二、堆外

由于堆外的内存空间也是分为存储内存(Storage)和执行内存(Execution),互相占用的规则和堆内的是一致的
统一内存管理(堆外)图示如下:
Spark内存管理模型(二)—— 统一内存管理(Unified Memory Manager)_第2张图片

注:本文的内容和图片摘取于:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/index.html

你可能感兴趣的:(Spark)