三、Spark 内存管理

《SparkSQL 4》--Spark内存分配 【Spark内存分配详解.pdf】 在 Spark 1.5 版本及以前,Spark 采用静态内存管理模型。Spark 1.6 版本推出以后,Spark 采用了统一内存管理模型。 ------静态内存管理: Spark 在一个 Executor 中的内存分为三块,一块是 execution 内存,一块是 storage 内存,一块是 other 内存。 1.... 阅读详情

Spark 内存管理

堆内和堆外内存

Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用。
堆内内存受到 JVM 统一管理,堆外内存是直接向操作系统进行内存的申请和释放。
在这里插入图片描述

堆内内存

由 Spark 应 用 程 序 启 动 时 的 – executor-memory 或spark.executor.memory 参数配置,Executor 内运行的并发任务共享 JVM 堆内内存
存储(Storage)内存:RDD 数据缓存 和广播(Broadcast)变量;
执行(Execution)内存:任务在执行 Shuffle 时占用的内存;
剩余(Other)空间:Spark 内部的对象实例,或者用户定义的 Spark 应用程序中的对象实例。

Spark 不能准确记录实际可用的堆内内存:在被 Spark 标记为释放的对象实例,有可能在实际上并没有被 JVM 回收,导致实际可用的内存小于 Spark 记录的可用内存。

堆外内存

Spark可以直接操作系统堆外内存,减少了不必要的内存开销,以及频繁的 GC 扫描和回收。堆外内存可以被精确地申请和释放(堆外内存之所以能够被精确的申请和释放,是由于内存的申请和释放不再通过JVM 机制,而是直接向操作系统申请和操作系统释放)

在默认情况下堆外内存并不启用,可通过配置spark.memory.offHeap.enabled 参数启用, 并由 spark.memory.offHeap.size 参数设定堆外空间的大小。堆外内存没有 other 空间,只有Storage内存和Execution内存。

堆外与堆内的平衡

对于需要处理的数据集,如果数据模式比较扁平,而且字段多是定长数据类型,就更多地使用堆外内存。

如果数据模式很复杂,嵌套结构或变长字段多,就更多采用 JVM 堆内内存会更加稳妥。

内存空间分配

静态内存管理(早期版本)

存储内存、执行内存和其他内存的大小在Spark 应用程序运行期间均为固定的,应用程序启动前可以通过参数配置。

在这里插入图片描述
堆外的空间只有存储内存和执行内存,由参数 spark.memory.storageFraction 决定

在这里插入图片描述

# 静态内存

# 堆内内存
# spark.executor.memory提交任务时指定executor 堆内内存总大小
可用的Execution内存 = executor.memory * spark.shuffle.memoryFraction * spark.shuffle.safety.Fraction
可用的Storage内存 = executor.memory * spark.storage.memoryFraction * spark.storage.safety.Fraction


# 堆外内存
# spark.memory.offHeap.size 提交任务时指定executor 堆外内存总大小
可用的存储内存 = memory.offHeap.size * spark.storage.memoryFraction
可用的执行内存 = memory.offHeap.size * ( 1- spark.storage.memoryFraction)

统一内存管理

与静态内存管理的区别在于存储内存和执行内存共享同一块空间,可以动态占用对方的空闲区域
在这里插入图片描述

统一内存管理的堆外内存
在这里插入图片描述

# 统一内存

# 堆内内存
# spark.executor.memory提交任务时指定executor 堆内内存总大小
初始可用的Execution内存 = (executor.memory -300M) * spark.memory.fraction * (1-spark.storage.storageFraction)
初始可用的Storage内存 = (executor.memory -300M) * spark.memory.fraction * spark.storage.storageFraction


# 堆外内存
# spark.memory.offHeap.size 提交任务时指定executor 堆外内存总大小
可用的存储内存 = memory.offHeap.size * spark.storage.memoryFraction
可用的执行内存 = memory.offHeap.size * ( 1- spark.storage.memoryFraction)

最重要的优化在于动态占用机制,其规则如下:

  • 如果对方的内存空间有空闲,双方可以互相抢占;

  • 对于 Storage Memory 抢占的 Execution Memory 部分,当分布式任务有计算需要时,Storage Memory 必须立即归还抢占的内存,涉及的缓存数据要么落盘、要么清除;

  • 对于 Execution Memory 抢占的 Storage Memory 部分,即便 Storage Memory 有收回内存的需要,也必须要等到分布式任务执行完毕才能释放。

(三)Spark内存管理 Spark 把 Executor 内存划分为 4 个区域,分别是 Reserved Memory、User Memory、Execution Memory 和 Storage Memory。通过调整 spark.executor.memory、spark.memory.fraction 和 spark.memory.storageFraction 这 3 个配置项,你可以灵活地调整不同内存区域的大小,从而去适配 Spark 作业对于内存的需求。 再者,在统一内存管理模... 阅读详情

相关推荐

Spark实战:使用Scala构建高效大数据处理应用

在大数据时代,企业需要处理海量数据以挖掘价值,但传统Hadoop MapReduce的高延迟已无法满足需求。Apache Spark作为新一代大数据处理框架,凭借内存计算将速度提升10-100倍,成为行业主流。而Scala作为Spark的原生语言,以其函数式编程特性完美适配分布式计算,让开发者能更简洁、高效地构建大数据应用。本文将从核心概念解析技术原理实现实际应用案例三个维度,用生活化比喻和实战代码,教你用Scala打造高效Spark应用。

SuperAGI2025 556

Spark 内存管理

根据 #User、#Storage、#Execution 预估大小 ,调整相关的内存配置项。区分 Execution Memory/Storage Memory 的初始大小。优化:把创建好的 Map 字典封装成广播变量,分发到各个 Executors。广播变量消耗 Storage Memory。

记录点点滴滴 922

通达信缠论中枢自动识别与画线实战指南

本文详细介绍了通达信缠论中枢自动识别与画线公式的实战应用。该工具通过严谨的算法逻辑,自动在K线图上标记出符合缠论定义的中枢区间,帮助投资者摆脱繁琐的手工画图,聚焦于价格与中枢的互动关系,从而高效识别趋势延续、背驰及第三类买卖点,提升缠论分析与交易决策的效率。

weixin_29267307的博客 662

内存参数 计算_Spark优化(四)----shuffle调优、堆外内存调优

1.Spark Shuffle调优shuffle在spark的算子中产生,也就是运行task的时候才会产生shuffle.2.sortShuffleManagerspark shuffle的默认计算引擎叫sortshuffleManager,它负责shuffle过程的执行、计算和组件的处理,sortshuffleManager会将task进行shuffle操作时产生的临时磁盘文件合并成一个磁盘文件...

weixin_34455676的博客 389

保姆级教程:用Fiddler+夜神模拟器搞定抖音App抓包(附SSL Pinning绕过实战)

本文提供了一套完整的移动端抓包解决方案,详细介绍了如何使用Fiddler和夜神模拟器进行抖音App抓包,并重点讲解了SSL Pinning绕过技术。通过Xposed框架和JustTrustMe模块的组合,实现高效抓包,适用于产品分析、竞品研究和安全测试等场景。

weixin_30855099的博客 421

Java utgard连接OPC问题记录

怎么开启是个问题, 是在引入openscada的jar包里的Sever类中修改,这就犯难了, 其实没必要, 只要在自己项目下创建与openscada中Server类相同的路径,并复制Server过去改就行了, 项目会优先使用本地类,像下面这样。奇迹发生了,0x00000005解决. 注: 我的安全补丁编码跟网上查到的并不一样, 所以最初没有删,后来全都删了就好了,这个编码规则咱也不知道.安全日志中记录用户登录行为, OPC通信需要使用Windows系统用户进行登录, 如果用户名密码错误这里会有相关记录.

wangxin1949的博客 2840

spark内存管理

一.spark内存管理只堆内存/堆外内存前世今生 1.堆内存和对外内存 作为jvm进程,executor的内存管理建立在jvm之上,spark对jvm的堆内空间进行了更为详细的分配,以充分利用内存, 1.1堆内存的大小 堆内存的大小,由spark应用程序启动的xexcuto-memory或spark-executor-memory参数配置,Executor内运行的并发任务共享JVM堆内内存,这些任务在缓存RDD和广播(Broadcast)数据时占用的内存被规划为存储(Storage)内存,而这些任务

LEOZHYD的博客 436

Ascend C 算子开发遇到的问题及解决方法

在学习Ascend C算子开发进阶课程的时候,进行Ascend C自定义算子工程、算子调用等实验,在开发环境中遇到了一些问题,在这里记录一下。首先如果在启智社区CANN版本为6.3 ,要进行Ascend C算子开发,需要更新CANN版本。

qq_45257495的博客 5109

spark:清空程序运行时的所有(cache)缓存块

spark:清空程序运行时的所有(cache)缓存块 为啥要用到缓存   在我们编写spark程序的时候,经常会用到action算子,当程序执行到action操作的代码时,开始真正地执行计算,这个时候耗时比较长。然而,当我们程序里面的action算子计算出来的需要被多次使用的时候,为了不在让程序重复再次计算。将这个action算子计算的结果进行persist或者cache(缓存)的操作,可以节省程...

善皮之的博客 6989

嵌入式环境下XML配置文件解析实践

在资源受限的嵌入式环境中,如何轻量级地解析XML配置文件成为关键。通过简化语法结构与优化内存使用,实现快速读取和解析配置文件,提升系统启动效率与稳定性。

weixin_31869917的博客 399

第一节:从Chat_Bot 到 AI_Agent——一个范式转换

本文系统剖析了工业级AI代理系统ClaudeCode的设计原理与工程实践。通过对比ChatBot与Agent的三个本质差异:自主循环决策vs单轮应答、环境交互vs纯文本I/O、持久状态管理vs无状态对话,揭示了构建生产级Agent系统的关键挑战。文章详细解析了ClaudeCode的五层架构设计、1800+文件组成的运行时系统,包括工具调度、权限管理、状态持久化等核心机制,并阐述了从简单API调用到完整Agent系统的演进路径。

2201_75869398的博客 67

spark性能优化----缓存清除

spark是一款优秀的框架,计算性能相当优异,已经发展成大数据主流计算引擎,在spark开发过程中有很多优化的点。其中去除重复计算是非常重要的。一般操作调用cache/persist,来缓存中间结果,避免重复计算。其中cache是persist的一个特列(cache相当于persist())。persist拥以下几个级别的缓存:NONE 默认配置(不缓存) DISK_ONLY 数据缓存到磁盘,...

u010990043的博客 1万+

STM32CubeMX | 38-使用硬件SPI驱动以太网模块(W5500)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件SPI外设与以W5500通信,驱动以太网模块。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): W5500以太网模块 这里我使用常见的以太网模块W5500: W5500官网 http://www.w5500.cn/ W5500中文手册 iEthernet W5500 Datasheet 软件准备 需要安装好Keil - MDK及芯片对应的包,以

Mculover666的博客(嵌入式) 7388

支持spark_Hadoop对比:Hadoop、Spark、Flink三大框架对比

目前来说,大数据领域最为活跃的三个计算框架,当属Hadoop、Spark以及Flink这三者。三个框架在不同的大数据处理场景当中,表现各有优势,因此也常常被拿来做比较。今天我们也来做个Hadoop对比,看看Hadoop、Spark、Flink三大框架,各自的优势劣势如何。1、数据处理对比Hadoop专为批处理而生,一次将大量数据集输入到输入中,进行处理并产生结果。Spark:定义是一个批处理系统,...

weixin_36252784的博客 447

基于STM32L4XX、HAL库的RTL8201F 以太网收发器(PHY)驱动程序设计

define PHY_RESET_DELAY 1000 // PHY复位延迟(ms)#define PHY_AUTONEGO_DELAY 3000 // 自动协商延迟(ms)/* 检查PHY ID (RTL8201F的ID为0x001CC816) *//* 系统时钟配置,确保ETH有50MHz时钟 *//* 初始化CPU, AHB和APB总线时钟 */

zhusl6688的博客 806

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spark基本知识点之内存管理

原地址:点击打开链接 Spark Memory Management 25 Replies Starting Apache Spark version 1.6.0, memory management model has changed. The old memory management model is implemented by StaticMemoryManag

jxhaha的博客 1148

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

spark1.6内存管理

  Spark从1.6.0版本开始,内存管理模块就发生了改变,旧版本的内存管理模块是实现了StaticMemoryManager类,现在被称为"legacy"。"Legacy"模式默认被置为不可用,这就意味着当你用Spark1.5.x和Spark1.6.x运行相同的代码会有不同的结果,应当多加注意。考虑的兼容性,可以通过设置spark.memory.useLegacyMode为可用,默认是fal...

weixin_30346033的博客 98

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Spark精讲】Spark内存管理

Spark精讲,Spark内存管理,静态内存管理,统一内存管理,Java运行时数据区,Java堆,垃圾回收机制

话数Science 2022

【Spark】Spark内存管理

Spark 的内存管理分为堆内内存和堆外内存。堆内内存包括执行内存(用于中间数据)和存储内存(用于缓存数据)。堆外内存提高性能,减少垃圾回收的影响。内存池由执行和存储内存组成,比例可通过配置调整(如 `spark.memory.fraction`)。堆外内存可通过 `spark.memory.offHeap.enabled` 启用。合理配置这些参数可以提高资源利用率,减少 GC 开销,优化作业性能。

DataCrafter的博客 1452

Spark内核之内存管理

目录 一、堆内内存和堆外内存 二、内存空间分配 2.1 早期内存管理(静态内存管理) 2.2 统一内存管理 2.3 同一管理内存的优点 三、存储内存管理 3.1 RDD的持久化机制 3.2RDD的缓存过程 3.3 淘汰与落盘 四、执行内存管理 4.1 Shuffle Write 4.2 Shuffle Read 一、堆内内存和堆外内存 --1. "堆内内存": 是指jvm所能使用的内存,并不是完全可以控制,如GC垃圾回收器的执行时间是不可控的,当你需要.

Markble 6769

Spark 内存管理机制

如果堆外内存被启用,那么 Executor 内将同时存在堆内和堆外内存,两者的使用互补影响,这个时候 Executor 中的 Execution 内存是堆内的 Execution 内存和堆外的 Execution 内存之和,同理,Storage 内存也一样。通过以上介绍可知,应用程序申请到资源量可能大于资源申请的资源量,比如YARN的最小可申请资源内存量为1024,规整因子是1024,如果一个应用程序申请1500内存,则会得到2048内存,如果规整因子是512,则得到1536内存。

大数据创新开发者、大数据技术开发、创新性大数据分享 1663

Spark Executor内存管理

我们都知道 Spark 能够有效的利用内存并进行分布式计算,其内存管理模块在整个系统中扮演着非常重要的角色。为了更好地利用 Spark,深入地理解其内存...

过往记忆大数据 4171

Spark内存管理详解

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

m0_61607827的博客 4854

Spark内存管理

由于同一个Executor的所有的计算任务共享有限的存储内存空间,当有新的 Block 需要缓存但是剩余空间不足且无法动态占用时,就要对LinkedHashMap中的旧Block进行淘汰(Eviction),而被淘汰的Block如果其存储级别中同时包含存储到磁盘的要求,则要对其进行落盘(Drop),否则直接删除该Block。以非序列化的Java对象的方式持久化在JVM内存中。此外,在被Spark标记为释放的对象实例,很有可能在实际上并没有被JVM回收,导致实际可用的内存小于Spark记录的可用内存。

走过冬季 1153
上一篇: Spark3 新特性之DPP
下一篇: Linux系统中负载高问题排查思路与解决方法
Shyllin
博客等级 码龄10年 131粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值