Spark 从 0 到 1 学习(6) —— Spark 内存管理


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

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

1. 静态内存管理

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

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

1.1 静态内存管理分布图

在这里插入图片描述

1.2 静态内存管理详解

  • 60% 的内存用于 spark 的存储。这部分内存中 10% 的内存用于预留,防止发生 OOM 异常。其他90% 的内存用于存储数据。这90% 的内存中 20% 用于解压缩和序列化数据,剩余的 80% 的内存用于存储 RDD 的缓存数据和广播变量。
  • 20% 的内存用于 spark 的 shuffle。这部分内存中 80% 的内存用于 shuffle 的聚合,其他 20% 的内存是预留内存,防止 OOM 异常。
  • 剩余的内存用于 task 的计算。

2. 统一内存管理

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

2.1 统一内存管理分布图

在这里插入图片描述

2.2 统一内存管理详解

  • 总内存预留出300M,用于JVM自身运行。
  • 剩余的内存中的 60 % 用于 spark ,其中一半用于 存储 RDD 缓存数据和广播变量,另一半用于 shuffle聚合。
  • 剩余的内存中的 40 % 用于 task 的计算。

3. reduce 中 OOM 如何处理?

  1. 减少每次拉取的数据量
  2. 提高 shuffle 聚合的内存比例
  3. 提高 Executor 的总内存

猜你喜欢

转载自blog.csdn.net/dwjf321/article/details/109048241
今日推荐