[Spark] Spark内存管理

夏侯威
• 阅读 1622

高层视图

[Spark] Spark内存管理

堆内内存 On-heap Memory
  • Executor内存管理建立在JVM的内存管理之上
  • executor-memory指定Executor内存
  • 并不能准确记录实际可用的堆内内存
堆外内存 Off-heap Memory
  • Spark通过JDK Unsafe API引入了堆外内存,用于存储序列化后的二进制数据
  • 通过配置 spark.memory.offHeap.enabled 参数启用,并由spark.memory.offHeap.size 参数设定堆外空间大小

堆内内存

就留个图方便复习的时候回忆,详细内容还写个屁啊, 直接看[这篇文章]
(https://www.jianshu.com/p/0f0...

[Spark] Spark内存管理

RDD 持久化缓存

RDD持久化

RDD 的持久化由 Spark 的 Storage 模块负责,实现了 RDD 与物理存储的解耦合。
Storage 模块负责管理 Spark 在计算过程中产生的数据,将那些在内存或磁盘、在本地或远程存取数据的功能封装了起来。在
具体实现时 Driver 端和 Executor 端的 Storage 模块构成了主从式的架构,即 Driver 端的 BlockManager 为 Master,Executor 端的 BlockManager 为 Slave。Storage 模块在逻辑上以 Block 为基本存储单位,RDD 的每个 Partition 经过处理后唯一对应一个 Block(BlockId 的格式为 rdd_RDD-ID_PARTITION-ID )。Master 负责整个 Spark 应用程序的 Block 的元数据信息的管理和维护,而 Slave 需要将 Block 的更新等状态上报到 Master,同时接收 Master 的命令,例如新增或删除一个 RDD。
[Spark] Spark内存管理

RDD缓存

RDD 在缓存到存储内存之前,Partition 中的数据一般以迭代器Iterator的数据结构来访问。通过 Iterator 可以获取分区中每一条序列化或者非序列化的数据项(Record),这些 Record 的对象实例在逻辑上占用了 JVM 堆内内存的 User Memory 部分的空间,同一 Partition 的不同 Record 的空间并不连续
RDD 在缓存到存储内存之后,Partition 被转换成 Block,Record 在堆内或堆外存储内存中占用一块连续的空间。将Partition由不连续的存储空间转换为连续存储空间的过程,Spark称之为"展开"(Unroll)。
每个 Executor 的 Storage 模块用一个链式 Map 结构(LinkedHashMap)来管理堆内和堆外存储内存中所有的 Block 对象的实例,对这个 LinkedHashMap 新增和删除间接记录了内存的申请和释放。
[Spark] Spark内存管理

缓存的淘汰和落盘

由于同一个 Executor 的所有的计算任务共享有限的存储内存空间,当有新的 Block 需要缓存但是剩余空间不足且无法动态占用时,就要对 LinkedHashMap 中的旧 Block 进行淘汰(Eviction),而被淘汰的 Block 如果其存储级别中同时包含存储到磁盘的要求,则要对其进行落盘(Drop),否则直接删除该 Block。

存储内存的淘汰规则为:

  1. 被淘汰的旧 Block 要与新 Block 的 MemoryMode 相同,即同属于堆外或堆内内存
  2. 新旧 Block 不能属于同一个 RDD,避免循环淘汰
  3. 旧 Block 所属 RDD 不能处于被读状态,避免引发一致性问题
  4. 遍历 LinkedHashMap 中 Block,按照最近最少使用(LRU)的顺序淘汰,直到满足新 Block 所需的空间。其中 LRU 是 LinkedHashMap 的特性。

落盘的流程则比较简单,如果其存储级别符合_useDisk 为 true 的条件,再根据其_deserialized 判断是否是非序列化的形式,若是则对其进行序列化,最后将数据存储到磁盘,在 Storage 模块中更新其信息。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java实现spark常用算子之cogroup
importorg.apache.spark.SparkConf;importorg.apache.spark.api.java.JavaPairRDD;importorg.apache.spark.api.java.JavaSparkContext;importorg.apache.spark.api.java.function.VoidF
Stella981 Stella981
3年前
Spark 3.0 on Kubernetes 的模式与最新发展
Spark3.0发布后,对Kubernetes的原生支持得到大幅增强,从而方便了Spark在云原生环境中的快速部署和运行实例的管理。这里探讨Spark onKubernetes生态的现状与挑战。参考:Spark3.01onKubernetes官方文档(https://www.oschina.net/actio
Stella981 Stella981
3年前
Spark 内存分配
Spark内存分配博客分类:sparkSpark1.5堆内存分配(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.cnblogs.com%2Fdreamfly2016%2Fp%2F5720180.html)
Stella981 Stella981
3年前
Flink(一)Flink的入门简介
一. Flink的引入    这几年大数据的飞速发展,出现了很多热门的开源社区,其中著名的有 Hadoop、Storm,以及后来的 Spark,他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河,也以内存为赌注,赢得了内存计算的飞速发展。Spark 的火热或多或少的掩盖了其他分布
Stella981 Stella981
3年前
SparkSql学习1 —— 借助SQlite数据库分析2000万数据
总所周知,Spark在内存计算领域非常强势,是未来计算的方向。Spark支持类Sql的语法,方便我们对DataFrame的数据进行统计操作。但是,作为初学者,我们今天暂且不讨论Spark的用法。我给自己提出了一个有意思的思维游戏:Java里面的随机数算法真的是随机的吗?好,思路如下:1\.取样,利用Java代码随机生成2000万条01
Stella981 Stella981
3年前
Spark学习之Spark安装
Spark安装spark运行环境spark是Scala写的,运行在jvm上,运行环境为java7如果使用Python的API,需要使用Python2.6或者Python3.4Spark1.6.2  Scala2.10  Spark2.0.0  Scala 2.11
Stella981 Stella981
3年前
Spark scala和java的api使用
1、利用scala语言开发spark的worcount程序(本地运行)packagecom.zy.sparkimportorg.apache.spark.rdd.RDDimportorg.apache.spark.{SparkConf,SparkContext}//todo:利用s
Stella981 Stella981
3年前
Flink简介
1. Flink的引入这几年大数据的飞速发展,出现了很多热门的开源社区,其中著名的有 Hadoop、Storm,以及后来的 Spark,他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河,也以内存为赌注,赢得了内存计算的飞速发展。Spark 的火热或多或少的掩盖了其他分布式计算的系统身影。就像 Flin
spark为什么比mapreduce快?
spark为什么比mapreduce快?首先澄清几个误区:1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是错误的2;DAG计算模型减少的是磁盘I/O次数(相比于mapreduce计算模型而言),
京东云开发者 京东云开发者
11个月前
spark为什么比mapreduce快?
spark为什么比mapreduce快?首先澄清几个误区:1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是错误的2;DAG计算模型减少的是磁盘I/O次数(相比于mapreduce计算模型而言),
京东云开发者 京东云开发者
6个月前
spark为什么比mapreduce快?
作者:京东零售吴化斌spark为什么比mapreduce快?首先澄清几个误区:1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是错误的2;DAG计算模型减少的是磁盘I/O次数(相比于mapredu