阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Spark1.6内存管理

436次阅读
没有评论

共计 3730 个字符,预计需要花费 10 分钟才能阅读完成。

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

这篇文章介绍自 spark1.6.0 版本后的新的内存管理模型,它实现的是 UnifiedMemoryManager 类。

Spark1.6 内存管理

在这张图中你可以看到三个主要内存区域。

1.Reserved Memory. 这部分内存是被系统预留的,它的大小也是被硬编码的。在 Spark1.6.0 版本,它的大小是 300MB,这就意味着这部分内存不能计入 Spark 内存计算,除非重新编译源码或设置 spark.testing.reservedMemory,它的大小是不可改变的,因为 park.testing.reservedMemory 只是一个测试参数所以在生产中不推荐使用。注意,这部分内存只是被称为“Reserved”, 实际上它不会被 spark 用来干任何事情,但是它限制了你在 spark 中可分配的内存大小。即使你想将全部 JVM 堆内存用于 spark 缓存数据,也不能使用这部分空闲内存(不是真的就浪费了,其实它存储了 Spark 的一些内部对象)。供参考,如果你不能为 executor 至少 1.5 * Reserved Memory = 450MB 的堆内存,任务将会失败并提示”please use larger heap size“的错误信息。

2.User Memory. 这部分内存是分配 Spark Memory 内存之后的部分,而且这部分用来干什么完全取决于你。你可以用来存储 RDD transformations 过程使用的数据结构。例如,你可以通过 mapPartitions transformation 重写 Spark aggregation,mapPartitions transformations 保存 hash 表保证 aggregation 运行。这部分数据就保存在 User Memory。再次强调,这是 User Memory 它完全由你决定存什么、如何使用,Spark 完全不会管你拿这块区域用来做什么,怎么用,也不会考虑你的代码在这块区域是否会导致内存溢出。

3.Spark Memory. 这部分内存就是由 Spark 管理了。这部分内存大小的计算:(“Java Heap”–“Reserved Memory”) * spark.memory.fraction,而且在 spark1.6.0 版本默认大小为:(“Java Heap”– 300MB) * 0.75。例如:如果堆内存大小有 4G,将有 2847MB 的 Spark Memory,Spark Memory=(4*1024MB-300)*0.75=2847MB。这部分内存会被分成两部分:Storage Memory 和 Execution Memory,而且这两部分的边界由 spark.memory.storageFraction 参数设定,默认是 0.5 即 50%。新的内存管理模型中的优点是,这个边界不是固定的,在内存压力下这个边界是可以移动的。如一个区域内存不够用时可以从另一区域借用内存。下边来讨论如何移动及使用的:

1.Storage Memory. 这部分内存即可以用来缓存 spark 数据也可以用来做 unroll 序列化数据的临时空间。广播变量以 block 的形式也存储在这里。你奇怪的是 unroll, 因为你可能会说,并不需要那么多空间去 unroll block 使其可用——在没有足够内存去 unroll bolock 的情况下,如果得到持久化级别的允许,将直接在这部分内存 unroll block。至于广播变量,当它的持久化级别为 MEMORY_AND_DISK 时,就会缓存到此。

2.Execution Memory. 这部分内存用于存储执行 task 过程中的一些对象。例如,它可以用来 shuflle map 端的中间缓存,也可以用来存储 hash aggregation 过程的 hash table. 在没有足够内存的时候,这部分内存支持溢室到磁盘,但是这部分内存的 blocks 不会被其它线程的 task 挤出去。

下边我们来说一下 Storage Memory 和 Execution Memory 之间的边界移动。从 Execution Memory 的本质来看,你不能将这部分内存空间的数据挤出去,因为这部分内存的数据是用来计算的中间结果,如果计算过程找不到原来存到这的 block 数据任务就会失败。但是对于 Storage Memory 内存就不会这样,它只是用来缓存内存中数据,如果将里边的 block 数据驱逐出去,就会更新 block 元数据映射信息使用到时告知该 block 被移除了,要想再拿到这些数据从 HDD 中读取即可(或者如果缓存级别没有溢写就重新计算)。

所以,我们只能 Execution Memory 可以向 Storage Memory 挤用空间,反之不可。那么当什么时候会发生 Execution Memory 向 Storage Memory 挤用空间呢?有两种可能:

•只要 Storage Memory 有可用空间,就可以增大 Execution Memory 大小,减少 Storage Memory 大小。

•Storage Memory 的空间大小已经超出了初始设定的大小,并且将这部分空间全部占用,在这种情况下就可以强制将从 Storage Memory 中移出 Blocks, 减少它的空间到初始大小。

反过来,在只有当 Execution Memory 空间有空余时,Storage Memory 才可以向 Execution Memory 借用空间,也就是说 Execution Memory 只要不够用了就可以向 Storage Memory 挤占空间不管 Storage Memory 有没有空余,而 Storage Memory 只能当 Execution Memory 有空余时才要以借用不能抢占。

初始 Storage Memory 大小:“Spark Memory”* spark.memory.storageFraction = (“Java Heap”–“Reserved Memory”) * spark.memory.fraction * spark.memory.storageFraction。根据默认值,即(“Java Heap”– 300MB) * 0.75 * 0.5 = (“Java Heap”– 300MB) * 0.375. 如果 Java Heap=4G,那么就有 1423.5MB 大小的 Storage Memory 空间。

这就意味着当我们使用 Spark cacheu 并加载全部数据到 executor 中时,至少要将 Storage Memory 大小等于默认初始值大小。因为当 Storage Memory 区域还没满时,Execution Memory 区域已经膨胀大于其初始设定大小时,我们不能强制将 Execution Memory 抢占的空间数据驱逐,所以最终 Storage Memory 会变小。

希望这篇文章可以帮你更好的理解 spark 新的内存管理机制,并以此来应用。

译自:spark-memory-management

更多 Spark 相关教程见以下内容

CentOS 7.0 下安装并配置 Spark  http://www.linuxidc.com/Linux/2015-08/122284.htm

Spark1.0.0 部署指南 http://www.linuxidc.com/Linux/2014-07/104304.htm

Spark 官方文档 – 中文翻译  http://www.linuxidc.com/Linux/2016-04/130621.htm

CentOS 6.2(64 位)下安装 Spark0.8.0 详细记录 http://www.linuxidc.com/Linux/2014-06/102583.htm

Spark 简介及其在 Ubuntu 下的安装使用 http://www.linuxidc.com/Linux/2013-08/88606.htm

安装 Spark 集群(在 CentOS 上) http://www.linuxidc.com/Linux/2013-08/88599.htm

Hadoop vs Spark 性能对比 http://www.linuxidc.com/Linux/2013-08/88597.htm

Spark 安装与学习 http://www.linuxidc.com/Linux/2013-08/88596.htm

Spark 并行计算模型 http://www.linuxidc.com/Linux/2012-12/76490.htm

Ubuntu 14.04 LTS 安装 Spark 1.6.0(伪分布式)http://www.linuxidc.com/Linux/2016-03/129068.htm

Spark 的详细介绍:请点这里
Spark 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/133776.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计3730字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7960447
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...