文章目录

  • 1. Executor内存逻辑架构
  • 2. Executor 界面内存计算
  • 3. UnrollMemory理解
  • 4. 参考

1. Executor内存逻辑架构

  1. 堆内存,由JVM分配和回收,由spark.executor.memory控制大小,JVM中序列化的对象是以字节流形式,其占用内存大小可直接计算,对于非序列化对象,其占用的内存是通过周期性地采样近似估算,且被spark标记为释放的对象实例也有可能并没有被JVM回收,所以spark并不能准确记录实际可用堆内存,也就无法避免内存溢出
  2. 非堆内存,不受JVM管理,有两部分,其中一部分通常是yarn模式中通过spark.executor.memoryOverhead配置,该部分内存用于虚拟机自身的开销(字符串、NIO和其它一些本地开销);另一部分通过spark.memory.offHeap.enable/size结合配置,该部分由spark直接使用于存储内存和任务内存,从2.0开始不再依赖第三方内存系统Tachyon,而是基于JDK自带的Unsafe API实现堆外内存管理,堆外内存可以精确地申请和释放,减少了不必要的额外开销。
  3. 系统内存(systemMemory):这里指的是JVM可用的最大内存,可通过Runtime.getRuntime.maxMemory获得该值,系统内存并不等于分配的堆内存,由于年轻代GC采用复制算法,所以有一块survivor内存区需要保留,即systemMemory=堆内存-survivor
  4. 可用内存(usableMemory):这部分内存是用户代码能直接影响到的,可用内存=系统内存 - Reserved,其中Reverved为固定300M的保留内存,用于spark系统内部使用。
  5. 应用内存:主要用于存储用户代码生成的数据对象,这些数据对象被缓存之前就是处于应用内存空间
  6. 存储内存与执行内存:存储内存用于缓存数据,执行内存主要用于满足 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统一内存划分相关推荐

  1. Apache Spark统一内存管理模型详解

    本文将对Spark的内存管理模型进行分析,下面的分析全部是基于ApacheSpark2.x进行的.文章仅对统一内存管理模块(UnifiedMemoryManager)进行分析,如对之前的静态内存管理感 ...

  2. Spark 统一内存管理模型详解

    堆内内存(On-heap Memory) 默认情况下,Spark 仅仅使用了堆内内存.Executor 端的堆内内存区域大致可以分为以下四大块: Execution 内存:主要用于存放 Shuffle ...

  3. Spark内存管理(2)—— 统一内存管理

    Spark内存管理系列文章:  Spark内存管理(1)-- 静态内存管理 堆内内存 Spark 1.6之后引入的统一内存管理机制,与静态内存管理的区别在于Storage和Execution共享同一块 ...

  4. spark executor内存分配_二十二、Spark之图解Executor端内存管理

    Spark应用程序执行时,Spark集群会启动Driver和Executor两种JVM进程,Driver端负责创建SparkContext上下文(通往集群的唯一通道),构建DAG, 创建Task并进行 ...

  5. 内存参数 计算_Spark统一内存管理的实现

    本文从源码角度分析spark统一内存管理的实现原理. 统一内存管理对象的创建 统一内存管理对象在SparkEnv中进行创建和管理,这样内存管理就在Driver和Executor端中都可以使用.在Spa ...

  6. Spark Executor内存管理

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

  7. Spark内存管理(3)—— 统一内存管理设计理念

    Spark内存管理系列文章:  Spark内存管理(1)-- 静态内存管理  Spark内存管理(2)-- 统一内存管理 在本文中,将会对各个内存的分布以及设计原理进行详细的阐述  相对于静态内存模型 ...

  8. spark 序列化错误 集群提交时_Spark统一内存管理机制

    一.内存的分配 预留内存:300m 可用内存 = 系统内存 -  预留内存 可用内存 = 统一内存(60%) + 其他 (40%) 统一内存 = 存储内存(Storage)50%  + 执行内存(Ex ...

  9. Spark(二): 内存管理

    2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块: Spark的内存可以大体归为两类:exe ...

最新文章

  1. 解决LC_ALL: 无法改变区域选项 (UTF-8): 没有那个文件或目录的问题
  2. 在Linux下安装RabbitMQ
  3. Eclipse Class Decompiler——Java反编译插件(转)
  4. Win10 通过升级安装完成后出现了中文字体忽大忽小的问题解决。
  5. ext不能选中复制属性_复制拷贝文件不怕再出错,一个超级好用的小工具,支持多线程工作...
  6. Linux scp 免密码 传输文件
  7. array专题2---理解暴力枚举与动态规划
  8. linux安装pytorch-GPU版本
  9. usermod命令,用户密码管理,makpasswd
  10. 4服务器内存和普通内存_Java服务器内存过高CPU过高问题排查
  11. hbuild html5打包apk,使用HBuilder打包5+App
  12. 简单的 OpenGL 纹理贴图不起作用?
  13. ES6学习:Map结构的目的和基本用法
  14. 关于正向代理,反向代理,负载均衡的个人理解
  15. 做完系统回来计算机连接不上网络,win7重装系统之后连不上网的原因和解决方案...
  16. 推荐一个赚钱平台,100%能赚钱(合法 长久 稳定)
  17. 计算机组成原理17----CPU指令流水线
  18. 计算机安装内存配置,电脑内存条怎么安装 安装内存条的注意事项
  19. 常见浏览器清理缓存方法
  20. 基,特征向量和基础解系

热门文章

  1. TTS 文字转语音研究,效果原来这么好。
  2. ppt取色html,网页安全色取色器
  3. Linux(Centos) Python编译安装达梦驱动 dmPython
  4. 记录一次Mysql gone away故障
  5. CentOS系统二进制安装MySQL
  6. php+微信小程序 websocket
  7. 英雄联盟:美服下路血魔流蛇女崛起,青龙刀剑圣就问你怕不怕?
  8. 利用高德地图API实现定位功能
  9. Antd Radio Group
  10. Unity开发1 Unity简介