深入理解 Spark(四)Spark 内存管理模型

这篇具有很好参考价值的文章主要介绍了深入理解 Spark(四)Spark 内存管理模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spark 中的内存管理和资源管理模型

Executor 进程作为一个 JVM 进程,其内存管理建立在 JVM 的内存管理之上,整个大致包含两种方式:堆内内存和堆外内存。
深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式
一个 Executor 当中的所有 Task 是共享堆内内存的。一个 Work 中的多个 Executor 中的多个 Task 是共享堆外内存的。

Executor 内存划分

深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

堆内内存和堆外内存

大数据领域两个比较常见的内存优化方案:

  • 引入堆外内存
  • 内存池化管理

作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(Onheap)空间进行了更为详细的分配,以充分利用内存。同时,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用。
深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

  • 没有堆外内存之前:min = n, max = m (假设 executor 的内存: x, executor 上运行的 Task 的数量: y,则每个 Task 均分得到的资源应该是: m = x / y , 设 n = m / 2,Task 能否运行取决于是否能申请到大小为 n 的初始内存)。每个 Task 能使用的资源使用量的区间:【m/2, m】,m = x/y
  • 引入堆外内存之后:堆外内存的大小:z, min = n, max = m + z。每个 Task 能使用的资源使用量的区间:【m/2, m + z】

Spark 对堆内内存的管理是一种逻辑上的规划式的管理,因为对象实例占用内存的申请和释放还是都由 JVM 完成,Spark 只能在申请后和释放前记录这些内存。堆内内存的大小,由 Spark 应用程序启动时的 --executor-memory 或 spark.executor.memory 参数配置。

  • 存储内存:存储 cache RDD 数据 和 广播变量数据(代码注释:used for caching andpropagating internal data across the cluster)
  • 执行内存:Shuffle 过程中占用的内存(代码注释:used for computation in shuffles, joins,sorts and aggregations)
  • other 空间:应用程序对象实例占用内存
堆内内存(On-Heap Memory)

深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

  • Executor Memory: 由 spark.executor.memory 配置,或者在提交的时候使用 --executormemory 进行配置。
  • Reserved Memory: 这个内存是写死了的,默认 300MB,但也可以修改,前提是在测试环境下,通过修改 spark.test.reservedMemory 参数对这个值进行修改;这块内存用于存储 Spark 内部的对象。
  • Usable Memory: Executor Memory - Reserved Memory 就是可用内存。
  • Unified Memory: Usable Memory * spark.memeory.fraction 比例值(约等于 UsableMemory * 60%),这个内存由 Storage 和 Execution 共用,这两个之间有一个动态调节机制.
  • Storage Memory: Unified Memory * spark.storage.storageFraction 比例值(约等于 UnifiedMemory * 50%),这块内存主要是用来存储一些缓存数据的,比如 cache(),persist(),RDD 的缓存数据等。
  • Executor Memory: Unified Memory * (1 - spark.storage.storageFraction 比例值),这块内存用于存储 Shuffle,Join,Sort,Aggregate 等计算过程中的临时数据。
  • User Memory: Usable Memory * (1 - spark.memeory.fraction 比例值),这块内存用于保存 RDD 转换操作时需要的一些数据,如父子 RDD 的依赖关系。
堆外内存(Off-Heap Memory)

深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

Task 能申请到的内存

spark.executor.cores 参数值就是 Spark 程序运行时得到的核数(以下简称为 N),每个 Task 能够分配到的内存大小为 1/2N ~ 1/N(举例,N=4,分配到的内存为 10G,那内存大小为 1.25G ~ 2.5G)。

静态内存管理模型:StaticMemoryManager

这种内存模型最大的问题是不熟悉 Spark 这种内存分配的开发者无法根据数据规模和任务规模做出相应的合理配置,容易造成旱的旱死,涝的涝死的水火两重天局面。Spark 为了兼容老版本应用程序的目的仍然保留了这种内存模型的实现和使用。
深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

统一内存管理模型:UnifiedMemoryManager

Spark-1.6 之后引入的统一内存管理机制,与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域。凭借统一内存管理机制,Spark 在一定程度上提高了堆内和堆外内存资源的利用率,降低了开发者维护 Spark 内存的难度。
深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

  • 如果存储内存已用完,可以占用执行内存中未用的内存。但是执行内存没有足够内存可用的时候,需要存储内存释放归还内存。
  • 如果执行内存已用完,可以占用存储内存中未用的内存。但是存储内存没有足够内存可用的时候,执行内存占用的存储内存是不会归还的。
  • 如果存储内存和执行内存都不足的时候,则他们会使用磁盘。

Spark MemoryManager 内存管理器

深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式

Spark BlockManager 资源管理机制原理

Spark-2.x 版本的 BlockManager 体系架构图:
深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式
Spark-3.x 版本的 BlockManager 体系架构图:
深入理解 Spark(四)Spark 内存管理模型,大数据,spark,大数据,分布式
总共有四大类操作:

  • 往本地存储数据
  • 往远程复制数据副本
  • 从本地读取数据
  • 从远程拉取数据

Spark RDD 持久化机制 和 Checkpoint 机制

checkpoint 与 presist 持久化的区别:文章来源地址https://www.toymoban.com/news/detail-821049.html

  • 持久化将数据保存到 cache 中,rdd 的 lineage 不变;checkpoint 执行完成 rdd 已经没有了依赖关系,同时把父 rdd 设置成了 CheckpointRDD,rdd 的lineage 改变。
  • 持久化的数据存储在内存或磁盘,随着 Executor 的关闭,BlockManager 会被 Stop,则 cache 的数据会被清除;checkpoint 通常选择的是高容错性的文件系统,如 HDFS,数据的安全性非常高。
  • RDD 持久化,不影响 job 执行效率,但是 RDD checkpoint 会使这个 Job 重复执行一次!这个效率低,所以一般建议 Spark cache 和 checkpoint 联合使用。

到了这里,关于深入理解 Spark(四)Spark 内存管理模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [AIGC ~大数据] 深入理解Hadoop、HDFS、Hive和Spark:Java大师的大数据研究之旅

    作为一位Java大师,我始终追求着技术的边界,最近我将目光聚焦在大数据领域。在这个充满机遇和挑战的领域中,我深入研究了Hadoop、HDFS、Hive和Spark等关键技术。本篇博客将从\\\"是什么\\\"、\\\"为什么\\\"和\\\"怎么办\\\"三个角度,系统地介绍这些技术。 Hadoop Hadoop是一个开源的分布式计算

    2024年02月03日
    浏览(31)
  • 分布式内存计算Spark环境部署与分布式内存计算Flink环境部署

    目录 分布式内存计算Spark环境部署 1.  简介 2.  安装 2.1【node1执行】下载并解压 2.2【node1执行】修改配置文件名称 2.3【node1执行】修改配置文件,spark-env.sh 2.4 【node1执行】修改配置文件,slaves 2.5【node1执行】分发 2.6【node2、node3执行】设置软链接 2.7【node1执行】启动Spark集群

    2024年02月08日
    浏览(52)
  • 深入理解 Spark(一)spark 运行模式简介与启动流程源码分析

    以 standalone-client 为例,运行过程如下: SparkContext 连接到 Master,向 Master 注册并申请资源(CPU Core 和 Memory); Master 根据 SparkContext 的资源申请要求和 Worker 心跳周期内报告的信息决定在哪个 Worker 上分配资源,然后在该 Worker 上获取资源,然后启动 StandaloneExecutorBackend; Stan

    2024年02月02日
    浏览(27)
  • Spark(29):Spark内存管理

    目录 0. 相关文章链接 1. 堆内和堆外内存规划 1.1. 堆内内存 1.2. 堆外内存 2. 内存空间分配 2.1. 静态内存管理 2.2. 统一内存管理 3. 存储内存管理 3.1. RDD 的持久化机制 3.2. RDD的缓存过程 3.3. 淘汰与落盘 4. 执行内存管理 4.1. Shuffle Write 4.2. Shuffle Read  Spark文章汇总      

    2024年02月17日
    浏览(27)
  • 云计算实验2 Spark分布式内存计算框架配置及编程案例

    掌握分布式多节点计算平台Spark配置,Spark编程环境IDEA配置,示例程序启动与运行 Linux的虚拟机环境、线上操作视频和实验指导手册 完成Spark开发环境安装、熟悉基本功能和编程方法。 请按照线上操作视频和实验指导手册 ,完成以下实验内容: 实验2-1 Spark安装部署:Standal

    2023年04月13日
    浏览(38)
  • 深入理解Spark编程中的map方法

    先上结论:不拘泥于形式,给一个东西,一顿操作,返回一个东西。且对每一条数据都相同的处理,处理完会生成新的东西,不改变之前你传进来的东西。        这个东西你可以理解为任何形式的数据,如map里的,对象,各种形式文件等等。  当深入理解 map 方法时,我们

    2024年01月24日
    浏览(31)
  • 深入理解 Spark(二)SparkApplication 提交和运行源码分析

    对于运行失败的 Task,TaskSetManager 会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的 Task 池子中等待重新执行,当重试次数过允许的最大次数,整个 Application失败。在记录 Task 失败次数过程中,TaskSetManager 还会记录它上一次失败所在的

    2024年01月17日
    浏览(32)
  • hive on spark内存模型

    hive on spark的调优,那必然涉及到这一系列框架的内存模型。本章就是来讲一下这些框架的内存模型。 hive on spark的任务,从开始到结束。总共涉及了3个框架。分别是:yarn、hive、spark 其中,hive只是一个客户端的角色。就不涉及任务运行时的内存。所以这里主要讲的yarn和spark的

    2024年04月16日
    浏览(34)
  • Spark内核解析-内存管理7(六)

    Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优。本文中阐述的原理基于 Spark 2.1 版本。 在执行 Spark 的应用程序时,Spark 集群会启动 Driver 和

    2024年02月03日
    浏览(30)
  • Spark大数据分析与实战笔记(第三章 Spark RDD 弹性分布式数据集-02)

    人生很长,不必慌张。你未长大,我要担当。 传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,但是其最大缺点是采用非循环式的数据流模型,使得在迭代计算式要进行大量的磁盘IO操作。Spark中的RDD可以很好的解决这一缺点。 RDD是Spark提供的最重要的抽象概念

    2024年02月22日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包