Spark _19 _Spark内存管理

在Spark _18 _Shuffle文件寻址https://georgedage.blog.csdn.net/article/details/103068770中的shffle寻址流程图中有说到shffle聚合内存的概念,本篇就是阐述Spark的内存管理。

官网:http://spark.apache.org/docs/2.3.0/configuration.html#memory-management

Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程,Driver负责创建SparkContext上下文,提交任务,task的分发等。Executor负责task的计算任务,并将结果返回给Driver。同时需要为需要持久化的RDD提供储存。Driver端的内存管理比较简单,这里所说的Spark内存管理针对Executor端的内存管理。

Spark内存管理分为静态内存管理和统一内存管理,Spark1.6之前使用的是静态内存管理,Spark1.6之后引入了统一内存管理。

静态内存管理中存储内存、执行内存和其他内存的大小在 Spark 应用程序运行期间均为固定的,但用户可以应用程序启动前进行配置。

统一内存管理与静态内存管理的区别在于储存内存和执行内存共享同一块空间,可以互相借用对方的空间。

Spark1.6以上版本默认使用的是统一内存管理,可以通过参数spark.memory.useLegacyMode 设置为true(默认为false)使用静态内存管理。

图示【更好理解】:

Spark _19 _Spark内存管理

【注】其中的参数均可以在配置文件,或者 官网上找到。

  • reduce 中OOM如何处理?
  1. 减少每次拉取的数据量
  2. 提高shuffle聚合的内存比例
  3. 提高Excutor的总内存