Spark统一内存划分
文章目录
- 1. Executor内存逻辑架构
- 2. Executor 界面内存计算
- 3. UnrollMemory理解
- 4. 参考
1. Executor内存逻辑架构
- 堆内存,由JVM分配和回收,由spark.executor.memory控制大小,JVM中序列化的对象是以字节流形式,其占用内存大小可直接计算,对于非序列化对象,其占用的内存是通过周期性地采样近似估算,且被spark标记为释放的对象实例也有可能并没有被JVM回收,所以spark并不能准确记录实际可用堆内存,也就无法避免内存溢出
- 非堆内存,不受JVM管理,有两部分,其中一部分通常是yarn模式中通过spark.executor.memoryOverhead配置,该部分内存用于虚拟机自身的开销(字符串、NIO和其它一些本地开销);另一部分通过spark.memory.offHeap.enable/size结合配置,该部分由spark直接使用于存储内存和任务内存,从2.0开始不再依赖第三方内存系统Tachyon,而是基于JDK自带的Unsafe API实现堆外内存管理,堆外内存可以精确地申请和释放,减少了不必要的额外开销。
- 系统内存(systemMemory):这里指的是JVM可用的最大内存,可通过Runtime.getRuntime.maxMemory获得该值,系统内存并不等于分配的堆内存,由于年轻代GC采用复制算法,所以有一块survivor内存区需要保留,即
systemMemory=堆内存-survivor
- 可用内存(usableMemory):这部分内存是用户代码能直接影响到的,
可用内存=系统内存 - Reserved
,其中Reverved为固定300M的保留内存,用于spark系统内部使用。 - 应用内存:主要用于存储用户代码生成的数据对象,这些数据对象被缓存之前就是处于应用内存空间
- 存储内存与执行内存:存储内存用于缓存数据,执行内存主要用于满足 Shuffle、 Join、 Sort、 Aggregation 等计算过程中对内存的需求,通过spark.memory.storageFraction控制两者比例,默认平分,两部分内存之间还可以进行动态占用:
- 执行内存的空间被对方占用后,可让对方将占用的部分转存到硬盘,然后归还借用空间
- 存储内存空间被对应占用后,无法让对方归还,因为shuffle过程中的很多因素无法实现
2. Executor 界面内存计算
在spark任务监控界面的Executors菜单中有一列“Storage Memory”显示当前“已用/总可用存储内存”情况,当使用静态内存机制时,此列总大小确实为存储内存,但使用统一内存机制时:
显示总内存 = 存储内存+执行内存
虽然两部分内存可以动态占用,但应该总不会把执行内存全部借光。此处分析统一内存该值是怎么个计算方式,既然知道显示的总内存是指存储内存和执行内存总和,那么结合逻辑架构图可以直观地看到组成方式:
显示总内存 =(堆内存储内存+堆内执行内存)+(堆外存储内存+堆外执行内存) =(可用内存-应用内存)+ offHeap= 可用内存 * spark.memory.fraction + offHeap=(系统内存-300M)* 0.6 + offHeap=(spark.executor.memory – survivor – 300M)* 0.6 + offHeap=(Runtime.getRuntime.maxMemory – 300M)* 0.6 + offHeap
这公式中survivor内存大小是核心,如果确定了就能确定总内存大小。按理解,可以通过NewRatio和SurvivorRatio计算出survivor大小的,但是通常指定了最大堆内存,但是jvm并不会初始化时就会申请到最大内存,则是动态增加的,所以survivor大小也只是一个估计值(约为90%)。可以通过指定Xms等于最大堆内存或者禁用UseAdaptiveSizePolicy,这样survivor就可以按比例计算出来。
另外需要注意一点,页面是通过请求”allexecutors”接口返回的数据,总内存对应的返回字段是maxMemory,单位是字节,而展现为GB时直接除1000而非1024,且最终结果小数位是五舍四入。
3. UnrollMemory理解
spark的rdd在缓存到存储内存之前,每条数据的对象实例都处于JVM进堆内内存的应用内存,即便同一个分区内的数据在内存空间也不是连续的(更可能不在同一物理节点?),具体分布由JVM管理,上层通过scala中的迭代器来访问。当rdd持久化储存内存之后,partition对应转换为block,此时数据在存储内存空间(堆内或堆外)中将连续的存储,这里将分区由不连续的存储空间转换为连续的存储空间的过程,就是unroll操作
在静态内存机制中,内存的构成部分有一个叫unroll内存,该部分从存储内存中独立划分 约占20%。但是在统一内存机制中,unroll内存却不存在了,其实在spark抽象的内存管理器(MemoryManger)中抽象了三个方法:
acquireStorageMemory
acquireUnrollMemory
acquireExecutionMemory
无论是统一内存(UnifiedMemoryManager)还是静态内存(StaticMemoryManager)按自己的逻辑实现了3个方法,统一内存中已经把存储内存和unroll内存合并,代码实现层面上UnifiedMemoryManager.acquireUnrollMemory
其实也只是简单地调用了一下acquireStorageMemory
4. 参考
《spark sql内核剖析》
https://zhuanlan.zhihu.com/p/115888408
https://www.jianshu.com/p/87a36488993a
https://blog.csdn.net/lemonZhaoTao/article/details/81990408
Spark统一内存划分相关推荐
- Apache Spark统一内存管理模型详解
本文将对Spark的内存管理模型进行分析,下面的分析全部是基于ApacheSpark2.x进行的.文章仅对统一内存管理模块(UnifiedMemoryManager)进行分析,如对之前的静态内存管理感 ...
- Spark 统一内存管理模型详解
堆内内存(On-heap Memory) 默认情况下,Spark 仅仅使用了堆内内存.Executor 端的堆内内存区域大致可以分为以下四大块: Execution 内存:主要用于存放 Shuffle ...
- Spark内存管理(2)—— 统一内存管理
Spark内存管理系列文章: Spark内存管理(1)-- 静态内存管理 堆内内存 Spark 1.6之后引入的统一内存管理机制,与静态内存管理的区别在于Storage和Execution共享同一块 ...
- spark executor内存分配_二十二、Spark之图解Executor端内存管理
Spark应用程序执行时,Spark集群会启动Driver和Executor两种JVM进程,Driver端负责创建SparkContext上下文(通往集群的唯一通道),构建DAG, 创建Task并进行 ...
- 内存参数 计算_Spark统一内存管理的实现
本文从源码角度分析spark统一内存管理的实现原理. 统一内存管理对象的创建 统一内存管理对象在SparkEnv中进行创建和管理,这样内存管理就在Driver和Executor端中都可以使用.在Spa ...
- Spark Executor内存管理
我们都知道 Spark 能够有效的利用内存并进行分布式计算,其内存管理模块在整个系统中扮演着非常重要的角色.为了更好地利用 Spark,深入地理解其内存管理模型具有非常重要的意义,这有助于我们对 Sp ...
- Spark内存管理(3)—— 统一内存管理设计理念
Spark内存管理系列文章: Spark内存管理(1)-- 静态内存管理 Spark内存管理(2)-- 统一内存管理 在本文中,将会对各个内存的分布以及设计原理进行详细的阐述 相对于静态内存模型 ...
- spark 序列化错误 集群提交时_Spark统一内存管理机制
一.内存的分配 预留内存:300m 可用内存 = 系统内存 - 预留内存 可用内存 = 统一内存(60%) + 其他 (40%) 统一内存 = 存储内存(Storage)50% + 执行内存(Ex ...
- Spark(二): 内存管理
2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块: Spark的内存可以大体归为两类:exe ...
最新文章
- 解决LC_ALL: 无法改变区域选项 (UTF-8): 没有那个文件或目录的问题
- 在Linux下安装RabbitMQ
- Eclipse Class Decompiler——Java反编译插件(转)
- Win10 通过升级安装完成后出现了中文字体忽大忽小的问题解决。
- ext不能选中复制属性_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...
- Linux scp 免密码 传输文件
- array专题2---理解暴力枚举与动态规划
- linux安装pytorch-GPU版本
- usermod命令,用户密码管理,makpasswd
- 4服务器内存和普通内存_Java服务器内存过高CPU过高问题排查
- hbuild html5打包apk,使用HBuilder打包5+App
- 简单的 OpenGL 纹理贴图不起作用?
- ES6学习:Map结构的目的和基本用法
- 关于正向代理,反向代理,负载均衡的个人理解
- 做完系统回来计算机连接不上网络,win7重装系统之后连不上网的原因和解决方案...
- 推荐一个赚钱平台,100%能赚钱(合法 长久 稳定)
- 计算机组成原理17----CPU指令流水线
- 计算机安装内存配置,电脑内存条怎么安装 安装内存条的注意事项
- 常见浏览器清理缓存方法
- 基,特征向量和基础解系