Spark两种内存管理
Spark动态内存管理
Spark 1.6 后改为动态内存管理(如果想启用静态内存管理,方法下面会介绍),启动动态主要体现在 存储内存和执行内存的动态。

动态内存管理内存中分为两大块和预留内存
- 用于用户数据结构和spark 元数据 的内存,默认占用整个内存的0.4
- 用于执行task 和 数据存储的内存 (M),默认占用整个内存的0.6(我这边是基于2.4,2.2版本是0.75)
- 300M 为预留内存
这个比例可以进行调整,大多数情况下不需要调整这个比例,这个比例适用于大多数情况。
spark.memory.fraction expresses 可以调整这个比例。
内存M
内存 M 分两大块,
* app 执行内存
* app 存储内存
执行内存和存储内存是可以动态借用
执行内存
也就是 shuffles joins sorts aggregations
Execution memory refers to that used for computation in shuffles, joins, sorts and aggregations
存储内存
存储内存也就是 cache(cache persist) 和 内存广播的数据(broadcast)
storage memory refers to that used for caching and propagating internal data across the cluster
在Spark中 执行内存和存储内存是在同一部分内存中。当执行内存没有用到,存储内存可以使用整个内存M,反之同理。在特殊情况下,执行内存可能会霸占存储内存,条件是 存储内存使用的空间比例大于 一个阈值 R。也就是 R区域的存储永远不会被霸占。由于现实的复杂性,存储内存不会去霸占执行内存。(霸占是我翻译后的词,翻译里面是 evict 驱赶)
这样设计的好处是:
- 当没有使用存储内存,存储内存可以使用整个M,避免不必要的磁盘溢出
- 确实使用缓存的应用程序可以保留最小的存储空间R,以免其数据块被霸占。最后,这种方法可为各种工作负载提供合理的即用性能,而无需用户了解如何在内部划分内存。
spark.memory.storageFraction 可以调整R 在M中占用的比例,默认 0.5
Spark静态内存管理
首先启用静态内存管理的方式是spark.memory.useLegacyMode true
.png)
spark.shuffle.memoryFraction
在洗牌期间用于 shuffles 过程中的aggregation and cogroups 。在任何给定时间,用于随机播放的所有内存映射的总体大小都受到此限制的限制,超出此限制,内容将开始溢出到磁盘。如果经常发生泄漏,请考虑以spark.storage.memoryFraction为代价增加此值。
我理解成 1.6后的 执行内存中一小块
spark.storage.memoryFraction
用于Spark的内存缓存的Java堆。它不应大于JVM中对象的 Old generation ,默认情况下,该对象的堆大小为0.6,但是如果您配置自己的旧代大小,则可以增加它。
也就是 存储内存
spark.storage.unrollFraction
是用于 block 序列化和反序列化的内存
Fraction of spark.storage.memoryFraction to use for unrolling blocks in memory. This is dynamically allocated by dropping existing blocks when there is not enough free storage space to unroll the new block in its entirety.
剩余的Task 执行内存
执行过程中不仅仅包含Shuffle 还有其他的计算占用内存。
本文参考
http://spark.apache.org/docs/latest/tuning.html#memory-management-overview
Spark两种内存管理的更多相关文章
- Spark 动态(统一)内存管理模型
作者编辑:王玮,胡玉林 一.回顾 在前面的一篇文章中我们介绍了spark静态内存管理模式以及相关知识https://blog.csdn.net/anitinaj/article/details/809 ...
- Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- (总结)Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- 大数据学习day33----spark13-----1.两种方式管理偏移量并将偏移量写入redis 2. MySQL事务的测试 3.利用MySQL事务实现数据统计的ExactlyOnce(sql语句中出现相同key时如何进行累加(此处时出现相同的单词))4 将数据写入kafka
1.两种方式管理偏移量并将偏移量写入redis (1)第一种:rdd的形式 一般是使用这种直连的方式,但其缺点是没法调用一些更加高级的api,如窗口操作.如果想更加精确的控制偏移量,就使用这种方式 代 ...
- 关于VAD的两种内存隐藏方式
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) 内存在0环的两种内 ...
- Nginx使用的php-fpm的两种进程管理方式及优化(转)
php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php ...
- windows的三种内存管理方法
Windows的内存管理方法 windows提供了3种方法来进行内存管理: l 虚拟内存,最适合用来管理大型对象或者结构数组 l 内存映射文件,最适合用来管理大型数据流 ...
- spark调优篇-Spark ON Yarn 内存管理(汇总)
本文旨在解析 spark on Yarn 的内存管理,使得 spark 调优思路更加清晰 内存相关参数 spark 是基于内存的计算,spark 调优大部分是针对内存的,了解 spark 内存参数有也 ...
- Spark 两种方法计算分组取Top N
Spark 分组取Top N运算 大数据处理中,对数据分组后,取TopN是非常常见的运算. 下面我们以一个例子来展示spark如何进行分组取Top的运算. 1.RDD方法分组取TopN from py ...
随机推荐
- FusionInsight大数据开发---Flume应用开发
Flume应用开发 要求: 了解Flume应用开发适用场景 掌握Flume应用开发 Flume应用场景Flume的核心是把数据从数据源收集过来,在送到目的地.为了保证输送一定成功,发送到目的地之前,会 ...
- (9)ASP.NET Core 中的MVC路由二
1.URL生成 MVC应用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL链接. IUrlHelper 接口用于生成URL,是MVC与路由之间的基础部分.在控制器.视图和视图组件 ...
- lazyload的使用方法
http://blog.csdn.net/peidandan/article/details/8107634
- protoc文件生成cs文件
1.下载protoc工具 点击下载 2.下载解压后打开文件,其中有一个.bat文件,里面对应命令行如下: 编写如下命令行 protoc.exe -I=. --csharp_out=. --grpc_ ...
- DataTable求列的最大值、最小值、平均值和样本数
与sql聚合函数相似,会屏蔽null table.Compute("max(ColumnName)", "true"); table.Compute(" ...
- 动画重定向技术分析及其在Unity中的应用
前言 笔者新的手游项目使用Unity引擎,动画部分要使用重定向技术来实现动画复用.笔者之前在大公司工作的时候对这块了解比较深入,读过Havok引擎在这部分的实现源码,并基于自己的理解,在公司自研的手游 ...
- docker,containerd,runc,docker-shim之间的关系
原文:https://blog.csdn.net/u013812710/article/details/79001463 关于containerd关于containerd的一些详解介绍,请参考cont ...
- 在ZYNQ上裸机跑ARM程序的演示
今天给大家演示如何在ZYNQ上,裸机跑ARM程序,本测试用的是米尔Z-turn Board单板,测试代码用的XILINX官方的C语言测试程序,用于测试挂接在ARM总线上的设备是否正常,并在串口终端打印 ...
- 6.Javascript如何处理循环的异步操作
前沿:参考ES6语法的async/await的处理机制 先上一段代码 function getMoney(){ var money=[100,200,300] for( let i=0; i<m ...
- K8S概念理解参考