08 | 内存管理:Spark如何使用内存?
Spark 内存区域划分
- 深入了解
- 翻译
- 解释
- 总结
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.66G2023-09-03归属地:江苏
- GAC·DUR: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-2711 - 小新Storage memory与Execution Memory之间抢占时,会有一个最小阈值吗?不可能全部抢占完吧?
作者回复: 从源码来看,还真没有~ 打个比方,比如应用中没有加任何的Cache,那随着内存需要的增长,Execution Task会逐渐蚕食掉全部Storage Memory部分的内存
2021-11-306 - 井先生既然user memory存储用户自定义的数据结构,我在纯sql的spark job中是不是把spark.memory.fraction设置很大的值,只给user memory留比较小的空间以提高execution和storage memory的大小,进而提高内存的使用率呢
作者回复: 没错,正解~ 老弟思考的相当到位~
2021-09-275 - 冯杰在实际工作中发现,设置的executor内存,还要扣除1/10的大小,剩余的9/10才能参与老师说的公式计算。 看了别人的博客,说是jvm中的Survivor,只能有1个被真正用起来。 Spark UI上显示的结果,也刚好能够反映这个问题
作者回复: 这个发现很有意思,愿闻其详~ 老弟能详细说说吗?我很感兴趣~ 尤其是Spark UI能够验证这种发现,极客应该是不能贴图,老弟加我微信,搜索“方块K”或是“rJunior”,一起详细讨论讨论~
2021-10-1224 - 大志error: not found: value MEMORY_ONLY import org.apache.spark.storage.StorageLevel._ wordCounts.persist(MEMORY_ONLY) // 就可以了
作者回复: 正解~
2021-09-2722 - Botanic老师好,我想请假一个问题。python中,如果wordCount加上take(5)这个算子后,数据类型就从RDD转化为list了,那么后面再使用saveAsTextFile算子就会报错,因为处理它要求前面的数据类型是RDD。这种情况应该怎么处理呢?谢谢
作者回复: 其实跟PySpark没什么关系哈,不管是Scala、Java、还是Python API,take都属于Action算子,得到的都是list。要想把RDD保存到文件,直接调用saveAsTextFile即可~
2021-12-231 - William老师,假设设定了spark.memory.storageFraction=0.4,那这部分用于存储的内存也是向计算内存转换的是吧? 那设定这个参数的意义是什么呢,单纯为了在计算内存足够的情况下预留储存空间吗?
作者回复: Storage memory与Execution Memory之间的边界,以及二者之间相互的抢占规则,老弟还需要再温习下哈~
2021-11-14 - AndyExecution = (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