零基础入门 Spark
吴磊
前 FreeWheel 机器学习研发经理
19171 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
零基础入门 Spark
15
15
1.0x
00:00/00:00
登录|注册

08 | 内存管理:Spark如何使用内存?

你好,我是吴磊。
第 6 讲,我们拜访了斯巴克建筑集团的分公司,熟悉了分公司的办公环境与人员配置,同时用“工地搬砖的任务”作类比,介绍了 Spark Shuffle 的工作原理。
今天这一讲,我们再次来到分公司,去看看斯巴克公司都在承接哪些建筑项目,以及这些项目是如何施工的。通过熟悉项目的施工过程,我们一起来学习 Spark 的内存管理。
斯巴克建筑集团分公司
相比其他大数据计算引擎,关于 Spark 的特性与优势,想必你听到最多的字眼,就是“内存计算”。合理而又充分地利用内存资源,是 Spark 的核心竞争力之一。因此,作为开发者,我们弄清楚 Spark 是如何使用内存的,就变得非常重要。
好啦,闲言少叙,请你戴好安全帽,跟我一起再次去拜访斯巴克集团分公司吧。不过,在正式“拜访”之前,我们还有一项准备工作要做,那就是先了解清楚 Spark 的内存区域是怎样划分的。

Spark 内存区域划分

对于任意一个 Executor 来说,Spark 会把内存分为 4 个区域,分别是 Reserved Memory、User Memory、Execution Memory 和 Storage Memory。
Spark内存区域划分
其中,Reserved Memory 固定为 300MB,不受开发者控制,它是 Spark 预留的、用来存储各种 Spark 内部对象的内存区域;User Memory 用于存储开发者自定义的数据结构,例如 RDD 算子中引用的数组、列表、映射等等。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spark内存管理是大数据计算引擎中的重要话题。文章介绍了Spark内存区域的划分和相互转化的逻辑。对于任意一个Executor来说,Spark将内存分为Reserved Memory、User Memory、Execution Memory和Storage Memory。在Spark 1.6版本之前,Execution Memory和Storage Memory的空间划分是静态的,而在1.6版本之后,Spark推出了统一内存管理模式,允许Execution Memory和Storage Memory之间相互转化。文章通过类比工地施工过程,生动地解释了不同内存区域的相互转化逻辑。操作区类比Execution Memory,暂存区类比Storage Memory,并介绍了它们之间的抢占规则。此外,文章还介绍了RDD Cache的基本用法,以及如何通过调整配置项来灵活地调整不同内存区域的大小,从而适配Spark作业对内存的需求。总的来说,本文深入探讨了Spark内存管理的核心概念和特性,对于开发者来说具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《零基础入门 Spark》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 嬴梦川
    置顶
    Reserved Memory: 300M = 0.3G User Memory: (10GB-300M)*(1-0.8) = 1988M = 1.94G Storage Memory: (10GB-300M)*0.8*0.4=3180.8M=3.11G Execution Memory: (10GB-300M)*0.8*(1-0.4)=4771.2M=4.66G
    2023-09-03归属地:江苏
  • GAC·DU
    R:300M U:(10240 - 300) * (1 - 0.8) =1988 E:(10240 - 300) * 0.8 * (1 - 0.4) = 4771.2 S:(10240 -300) * 0.8 * 0.4 = 3180.8 老师实际生产环境,把spark. executor. memory设置为物理内存的80%合理吗?

    作者回复: 满分💯 可以的,这里的0.8,其实不是物理内存的80%,而是分配给Executor JVM heap的80%,没什么风险的

    2021-09-27
    11
  • 小新
    Storage memory与Execution Memory之间抢占时,会有一个最小阈值吗?不可能全部抢占完吧?

    作者回复: 从源码来看,还真没有~ 打个比方,比如应用中没有加任何的Cache,那随着内存需要的增长,Execution Task会逐渐蚕食掉全部Storage Memory部分的内存

    2021-11-30
    6
  • 井先生
    既然user memory存储用户自定义的数据结构,我在纯sql的spark job中是不是把spark.memory.fraction设置很大的值,只给user memory留比较小的空间以提高execution和storage memory的大小,进而提高内存的使用率呢

    作者回复: 没错,正解~ 老弟思考的相当到位~

    2021-09-27
    5
  • 冯杰
    在实际工作中发现,设置的executor内存,还要扣除1/10的大小,剩余的9/10才能参与老师说的公式计算。 看了别人的博客,说是jvm中的Survivor,只能有1个被真正用起来。 Spark UI上显示的结果,也刚好能够反映这个问题

    作者回复: 这个发现很有意思,愿闻其详~ 老弟能详细说说吗?我很感兴趣~ 尤其是Spark UI能够验证这种发现,极客应该是不能贴图,老弟加我微信,搜索“方块K”或是“rJunior”,一起详细讨论讨论~

    2021-10-12
    2
    4
  • 大志
    error: not found: value MEMORY_ONLY import org.apache.spark.storage.StorageLevel._ wordCounts.persist(MEMORY_ONLY) // 就可以了

    作者回复: 正解~

    2021-09-27
    2
    2
  • Botanic
    老师好,我想请假一个问题。python中,如果wordCount加上take(5)这个算子后,数据类型就从RDD转化为list了,那么后面再使用saveAsTextFile算子就会报错,因为处理它要求前面的数据类型是RDD。这种情况应该怎么处理呢?谢谢

    作者回复: 其实跟PySpark没什么关系哈,不管是Scala、Java、还是Python API,take都属于Action算子,得到的都是list。要想把RDD保存到文件,直接调用saveAsTextFile即可~

    2021-12-23
    1
  • William
    老师,假设设定了spark.memory.storageFraction=0.4,那这部分用于存储的内存也是向计算内存转换的是吧? 那设定这个参数的意义是什么呢,单纯为了在计算内存足够的情况下预留储存空间吗?

    作者回复: Storage memory与Execution Memory之间的边界,以及二者之间相互的抢占规则,老弟还需要再温习下哈~

    2021-11-14
  • Andy
    Execution = (10G-300M)* 0.8 * (1-0.4) = 4771.2M User = (10G-300M) * (1-0.8) = 1988M Reserved = (10G-300M)* 0.8 * 0.4 = 3180.8M Storage = 300M

    作者回复: 算的没错~ 不过老弟Storage和Reserved写反了吧,哈哈

    2021-11-13
  • Geek_2dfa9a
    这里粗略估计1GB为1000MB Reserved Memory = 300MB Execution Memory + Storage Memory = (10GB - 0.3GB) * 0.8 = 9.7GB * 0.8 = 7.76GB User Memory = 9.7GB - 7.76GB = 1.94GB Execution Memory = 7.76GB * (1 - 0.4) = 7.76GB * 0.6 = 4.66GB Storage Memory = 7.76GB - 4.66GB = 3.1GB

    作者回复: 正解,满分💯

    2021-09-30
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部