三、Spark 内存管理

news2024/11/13 7:57:16

文章目录

  • Spark 内存管理
    • 堆内和堆外内存
      • 堆内内存
      • 堆外内存
      • 堆外与堆内的平衡
    • 内存空间分配
      • 静态内存管理(早期版本)
      • 统一内存管理

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 有收回内存的需要,也必须要等到分布式任务执行完毕才能释放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java——打开轮盘锁

题目链接 leetcode在线oj题——打开轮盘锁 题目描述 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’&#xff0…

对话镕铭微电子蔡媛:深入理解用户痛点,满足差异化需求

“芯片不仅仅是一个硬件产品,为了更好的贴近用户、服务用户,我们需要在固件和软件的框架上投入足够的研发资源,与客户同步迭代更新,以适应其快速的业务迭代要求。在深入理解用户需求和痛点的基础上,满足用户差异化的功…

【STL】模拟实现list

目录 1、list介绍 所要实现类及其成员函数接口总览 2、结点类的模拟实现 基本框架 构造函数 3、迭代器类的模拟实现 迭代器类存在的意义 3.1、正向迭代器 基本框架 默认成员函数 构造函数 运算符重载 --运算符重载 !运算符重载 运算符重载 *运算符重载 …

MapReduce全排序和二次排序

排序是MapReduce框架中最重要的操作之一。MapTask和ReduceTask均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序,而不管逻辑上是否需要。默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。对于MapTask…

考研复试——操作系统

文章目录操作系统1. 操作系统的特征:2. 进程与线程的关系以及区别3. 简述进程和程序的区别4. 进程的常见状态?以及各种状态之间的转换条件?5. 进程的调度算法有哪些?6. 什么是死锁?产生条件?如何避免死锁&a…

【强化学习】强化学习数学基础:随机近似理论与随机梯度下降

强化学习数学基础:随机近似理论与随机梯度下降Stochastic Approximation and Stochastic Gradient Descent举个例子Robbins-Monro algorithm算法描述举个例子收敛性分析将RM算法用于mean estimationStochastic gradient descent算法描述示例和应用收敛性分析收敛模式…

Rainbond V5.12 版本发布,支持平台级插件和能力扩展

在这个版本中,我们主要支持了平台级的插件和能力扩展。希望能通过外部插件扩展平台能力,实现微内核的效果;同时以后将会继续精简安装,能让用户按需扩展平台功能。在 Kubernetes 兼容性这方面,我们也通过平台级的能力将…

详解JAVA类加载

目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念: 类加载器(Class Loader)是Java虚拟机(JVM)的一个重要组件,负责加载Java类到内存中并使其可以被JVM执行。类…

2023/3/6 VUE - 组件传值【通信】方式

1 父亲传子代传值【子代使用父代的数据】 1.1 props传值 父亲给儿子传值: 爷爷给孙子传值: 这个props传值的方式,只能一代一代的往下传,不能跨代传值。 有一个问题:子组件不能修改父组件的值: 1.2 …

MyBatis学习笔记(十) —— 动态SQL

10、动态SQL MyBatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串的痛点问题。 动态SQL: 1、if 标签:通过test属性中的表达式判断标签中的内容是否有效(是否会拼接到sql中…

RTOS中相对延时和绝对延时的区别

相信许多朋友都有过这么一个需求:固定一个时间(周期)去处理某一件事情。 比如:固定间隔10ms去采集传感器的数据,然后通过一种算法计算出一个结果,最后通过指令发送出去。 你会通过什么方式解决呢&#xf…

Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

前言在日常的项目中,缓存的使用场景是比较多的。缓存是分布式系统中的重要组件,主要解决在高并发、大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问。本文以Redis作为缓存时,针对常见的缓存击穿、缓存穿透…

Java中 new Integer 与 Integer.valueOf 的区别

引入:new Integer(18) 与 Integer.valueOf(18) 有区别吗?有的话,有什么区别? 我们都知道,使用 new 关键字的时候,每次都会新创建一个对象。但是,Integer.valueOf() 会新创建一个对象吗&#xf…

Linux环境下实现并详细分析c/cpp线程池(附源码)

一、线程池原理 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 线程池是一种多线程处理形式,处理过程中将任务添加到…

Unity Animator.Play(stateName, layer, normalizedTime) 播放动画函数用法

原理 接口: public void Play(string stateName, int layer -1, float normalizedTime float.NegativeInfinity);参数含义stateName动画状态机的某个状态名字layer第几层的动画状态机,-1 表示播放第一个状态或者第一个哈希到的状态normalizedTime从s…

spring security 实现自定义认证和登录(4):使用token进行验证

前面我们实现了给客户端下发token,虽然客户端拿到了token,但我们还没处理客户端下一次携带token请求时如何验证,我们想要实现拿得到token之后,只需要验证token,不需要用户再携带用户名和密码了。 1. 禁用 UsernamePass…

崭新的centos虚拟机不能上网

原因 先说点简单的: 没启用虚拟机容器的网络选项虚拟机的网卡没启用手动设置了网关、掩码、dns等没设置对DHCP没开 做法 没启用虚拟机容器的网络选项 在virtualbox里面,开启虚拟机后右下角有个网络选项这里亮着就说明开了,没亮就右键打开…

BufferQueue研究

我们在工作的过程中,肯定听过分析卡顿或者冻屏问题的时候,定位到APP卡在dequeueBuffer方法里面,或者也听身边的同事老说3Buffer等信息。所以3Buffer是什么鬼?什么是BufferQueue?搞Android,你一定知道Graphic Buffer和…

理解js的精度问题

参考博客:js精度丢失问题-看这篇文章就够了(通俗易懂)、探寻 JavaScript 精度问题以及解决方案、JavaScript 浮点数陷阱及解法 1 为什么 JavaScript 中所有数字包括整数和小数都只有一种类型 即 Number类型,它的实现遵循 IEEE 754 标准。 符号位S&#…

MySQL运维篇之Mycat分片规则

3.5.3、Mycat分片规则 3.5.3.1、范围分片 根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。 示例: 可以通过修改autopartition-long.txt自定义分片范围。 注意: 范围分片针对于数字类型的字段,…