最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

必须要懂的Spark内存管理模型

[复制链接]
跳转到指定楼层
楼主
发表于 2019-8-20 15:20:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
0、前 言
Apache Spark是目前大数据领域主流的内存计算引擎,无论是在批处理还是实时流处理方面都有着广泛的应用。我们跑作业的时候,首先要给Spark Job分配一定的资源,比如一个executor分配5G内存,有时候我们会纠结于executor的内存有多少用于了实际计算。因此就需要了解一下Spark的内存管理,还有就是掌握了Spark的内存模型对于优化我们的作业也至关重要。
在Spark 1.5及之前版本中,内存管理默认实现是StaticMemoryManager,称为静态内存管理。从Spark 1.6.0版本开始,Spark默认采用一种新的内存管理模型UnifiedMemoryManager,称为统一内存管理,其特点是可以动态调整Execution和Storage的内存,参见SPARK-10000,因此又称为动态内存管理。本文我们就以Executor为例,介绍一下Spark的统一内存管理。

1、Spark内存管理
首先我们看一下Spark的内存使用,主要分为两类:Execution Memory和Storage Memory。其中,Execution Memory主要用于计算,如shuffles、joins、sorts及aggregations等操作,Storage Memory主要用于cache数据和在集群内部传输数据。
Executor默认只使用堆内内存(On-heap Memory)。为了进一步优化内存的使用,Spark引入了堆外内存(Off-heap Memory),默认是关闭状态。接下来,将详细说明Spark Executor堆内内存与堆外内存的具体情况。

1.1 On-heap Memory
Spark Executor通过spark.executor.memory或--executor-memory配置的内存为堆内内存,可以分为以下四块区域:
  • Execution Memory:主要用于shuffles、joins、sorts及aggregations等计算操作,又称为Shuffle Memory。
  • Storage Memory:主要用于cache数据、unroll数据,有时也被称为Cache Memory。
  • User Memory:用户内存,主要用于存储内部元数据、用户自定义的数据结构等,根据用户实际定义进行使用。
  • Reserved Memory:默认300M的系统预留内存,主要用于程序运行,参见SPARK-12081。


各个区域内存情况,如下图所示:

以上图解中,参数说明如下:

  • 参数spark.memory.fractionSpark 1.6版本中默认0.75,即Spark Memory(Execution Memory + Storage Memory)默认占整个usableMemory(systemMemory - Reserved Memory)内存的75%,而在Spark 2.x版本中默认0.6,默认占usableMemory内存的60%。


  • 参数spark.memory.storageFraction默认0.5,代表Storage Memory占用Spark Memory百分比,(1 - spark.memory.storageFraction)代表Execution Memory占用Spark Memory百分比,默认值0.5表示Spark Memory中Execution Memory和Storage Memory各占一半。


1.2 Off-heap Memory

为了进一步优化内存的使用,减小GC开销,Spark 1.6版本还增加了对Off-heap Memory的支持,参见SPARK-11389,但Off-heap Memory默认是关闭的,开启须设置参数spark.memory.offHeap.enabled为true,并通过参数spark.memory.offHeap.size设置堆外内存大小,单位为字节。

堆外内存划分上没有了用户内存与预留内存,只包含Execution Memory和Storage Memory两块区域,内存情况如下图所示:


以上图解中,maxOffHeapMemory大小就是spark.memory.offHeap.size的值,spark.memory.storageFraction默认值不变。

3、动态内存分配

在如上两个图解中,我们可以看到Execution Memory与Storage Memory之间有一条可以上下移动的虚线,说明Execution Memory与Storage Memory不是固定不变的,彼此之间可以相互共享,这便是Spark动态内存管理的含义。Spark 1.5及之前版本,两者是固定不变的,即前文提及的静态内存管理。

意思是说,当Execution Memory有空闲,Storage Memory不足时,Storage Memory可以借用Execution Memory,反之亦然。Execution Memory可以让Storage Memory写到磁盘,收回被占用的空间。如果Storage Memory被Execution Memory借用,因为实现上的复杂度,却收回不了空间。

4、Legacy Mode

Spark 1.6版本开始,默认使用动态(统一)内存管理模型,但之前的静态内存管理模型(StaticMemoryManager)仍然保留,通过称为Legacy模式的参数spark.memory.useLegacyMode控制,默认false为不开启静态内存管理。

5、总 结
Apache Spark从1.6.0版本开始,其内存管理模块默认采用了动态内存管理模型,一直延续使用到Spark 2.x。本文参考了社区的一些分享,结合相关图解,从Spark总体内存使用、堆内内存、堆外内存等几个方面,重点对Spark的动态内存管理这块做了简单介绍。

作者:Andy
​来源:大数据手稿笔记

楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-3 22:47

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表