Spark内存管理

1、spark的一大特性就是基于内存计算,Driver只保存任务的宏观性的元数据,数据量较小,且在执行过程中基本不变,不做重点分析,而真正的计算任务Task分布在各个Executor中,其中的内存数据量大,且会随着计算的进行会发生实时变化,所以Executor的内存管理才分析的重点。

2、在执行Spark应用程序时,集群会启动Driver和Executor两种JVM进程,前者为主控进程,负责创建spark上下文(context),提交spark作业(job),将作业转化为计算任务(task),在各个Executor进程间协调任务的调度。后者负责在工作节点上执行具体任务,并将结果返回给Driver,同时为需要持久化的RDD提供存储功能。

3、作为一个JVM进程,Executor的内存管理时基于JVM内存管理机制的,spark对JVM-on-heap内存进行了更为详细的规划,以充分利用。同时spark还引入了off-heap内存,使之可以直接从运行节点的系统内存中开辟空间,进一步优化内存的使用。
【堆内存的分配和回收完全依赖JVM的gc机制,应用不能灵活的操作内存,使用堆外内存则可以通过OS来分配和释放,较为灵活】

早期静态内存管理:on-heap分为四个区域,分别是Storage(20%)、Execution(60%)、Other(20%)、Ext,Storage用于缓存持久化的RDD数据和广播变量等,Execution用于缓存shuffle过程中产生的中间数据,Other区用于存储运行中的其他对象,Ext是一块较小的预留空间,用以防止OOM的发生,起到兜底作用,几个区块间有严格的界限,不可逾越。off-heap分为两个区,Storage(50%)、Execution(50%),也有严格界限,不可逾越。
spark1.6后引入统一内存管理:与静态管理机制的不同在于初始Storage(50%)、Execution(50%),在执行过程中两个区域可以根据自己和对方的内粗余量弹性的越界分配,更加灵活高效。off-heap也是两个区域,没有严格界限可以动态占用。

4、内存的动态占用:
0.存储 < 50% && 执行 < 50%:互不占用
1.存储 > 50% && 执行 > 50%:溢写磁盘(前提是缓存级别包含磁盘,若级别为纯内存则丢弃数据)
2.存储 > 50% && 执行 < 50%:存储跨界借用,若一段时间后执行内存不足,则删除被借用内存,优先满足执行的内存需要。
3.存储 < 50% && 执行 > 50%:执行跨界借用,若一段时间后存储内存不足,则不能被执行占用的存储区内存,因为执行的优先级更高,要优先保证执行数据。
***
5、统一内存管理机制,有效的提高了堆内存和堆外内存的使用效率,降低了使用复杂度,但是并不能就此高枕无忧。由于RDD数据往往是长期生存的,如果存储在内存中的数据过多,会引发频繁的full-gc,降低了程序的吞吐量。

原文地址:https://www.cnblogs.com/JaxYoun/p/12336945.html

时间: 2024-10-09 06:08:47

Spark内存管理的相关文章

Apache Spark 内存管理详解

Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 Spark 内存管理的脉络,抛砖引玉,引出读者对这个话题的深入探讨.本文中阐述的原理基于 Spark 2.1 版本,阅读本文需要读者有一定的 Spark 和 Java 基础,了解 RDD.Shuffle.JVM 等相关概念. 在执行 Spark 的应用程序时,Spark 集群会启动 Driver

Spark内存管理机制

Spark内存管理机制 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优. 在执行 Spark 的应用程序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 进程,前者为主控进程,负责创建 Spark 上下文,提交 Spark 作业(Job),并将作业转化为计算任务(Task),在各个 Executor 进程间协调任务的调度,后者负责在

【Spark-core学习之八】 SparkShuffle &amp; Spark内存管理

[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark-1.6 一.SparkShuffle1. SparkShuffle概念reduceByKey会将上一个RDD中的每一个key对应的所有value聚合成一个value,然后生成一个新的RDD,元素类型是<key,v

spark内存管理器--MemoryManager源码解析

MemoryManager内存管理器 内存管理器可以说是spark内核中最重要的基础模块之一,shuffle时的排序,rdd缓存,展开内存,广播变量,Task运行结果的存储等等,凡是需要使用内存的地方都需要向内存管理器定额申请.我认为内存管理器的主要作用是为了尽可能减小内存溢出的同时提高内存利用率.旧版本的spark的内存管理是静态内存管理器StaticMemoryManager,而新版本(应该是从1.6之后吧,记不清了)则改成了统一内存管理器UnifiedMemoryManager,同一内存管

Spark 内存管理

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

spark 源码分析之十五 -- Spark内存管理剖析

原文地址:https://www.cnblogs.com/johnny666888/p/11197519.html

王家林谈Spark性能优化第十季之全球独家揭秘Spark统一内存管理!

内容: 1.传统的Spark内存管理的问题: 2.Spark统一内存管理: 3. 展望: ==========传统的Spark内存管理的问题============ Spark内存分为三部分: Execution:Shuffles.Joins.Sort.Aggregations等等,默认情况下占用,spark.shuffle.memoryfraction默认是0.2: Storage:Persist(Canche).Large Task Result.Torrent类型的Broadcast等,默

Spark学习之路 (十一)SparkCore的调优之Spark内存模型

摘抄自:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/index.html 一.概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 Spark 内存管理的脉络,抛砖引玉,引出读者对这个话题的深入探讨.本文

spark记录(9)SparkCore的调优之Spark内存模型

摘抄自:https://www.cnblogs.com/qingyunzong/p/8946637.html 一.概述 Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨在梳理出 Spark 内存管理的脉络,抛砖引玉,引出读者对这个话题的深入探讨.本文中阐述的原理基于 Spark 2.1 版本,阅读本文需要读者有一定的 Spark 和 Java 基础,了解