解惑|很多人对spark内存调优不太理解的配置

本文深入探讨Spark内存管理机制,解析spark.memory.fraction与spark.memory.storageFraction参数的作用,阐述如何在GC压力大时,合理调整内存分配,避免老年代内存溢出,保障大数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,星球里有个妹子问了一个问题,问题出自前面的一篇文章:

spark 内存,GC及数据结构调优

其中有段话


 
2),在gc的统计信息中,如果老年代接近满了,	
减少用于缓存的内存(通过减小spark.memory.Fraction)。	
缓存较少的对象比降低运行速度对我们来说更有好处。	
另外,可以考虑减少年轻代。可以通过减小-Xmn参数设置的值,假如使用的话。	
假如没有设置可以修改JVM的NewRation参数。	
大多数JVMs默认值是2,意思是老年代占用了三分之二的总内存。	
这个值要足够大,相当于扩展了spark.memory.fraction.

她的疑惑是为啥不直接设置:

spark.memory.storageFraction

以减少存储内存的占比。

大家可以思考一下,减少spark.memory.storageFraction,可行吗?

明显是不太可行的,这个是没有理解这两个参数的含义。

要知道spark的大部分内存分为执行内存和存储内存。他们共享一个存储空间M。同时,存储内存在执行内存空闲的时候可以占用执行内存空间,执行内存也可以在存储内存大于一个阈值R的时候占用存储内存。R代表缓存不可被清除的最小存储内存。

M和R的计算如下:


 
1),spark.memory.fraction将M的大小表示为(JVM堆空间 - 300MB)	
的一部分(默认为0.75,新版本如spark2.2改为0.6)。	
剩余的空间(25%,对应的新版本是0.4)用于用户数据结构,	
Spark中的内部元数据,并且在稀疏和异常大的记录的情况下保护OOM错误。	
2),spark.memory.storageFraction表示R的大小作为M的一部分(	
默认为0.5)。R是M内的存储空间,其中缓存的块免于被执行器驱逐。

然后就会明白,假如我们单纯的减少spark.memory.storageFraction是行不通的,因为存储内存可以占用执行内存进行缓存,缓解不了老年代被吃满的状况,所以只能调整spark.memory.fraction。

1.当然,除了这样,还可以减少年轻代大小,前提是不影响性能。

2.spark最骚的操作是,没有加内存解决不了的问题,假如有那是没加够。

所以建议大家在学习的时候注意深入细心,然后连贯思考。

关于spark,flink,kafka等大数据框架的疑难杂症,欢迎加入浪尖知识星球,让浪尖帮你解惑。

640?wx_fmt=png

【 优惠倒计时 1 天 】

《Elasticsearch 核心技术与实战》,

口碑很不错,上线仅 1 周,订阅 9000+


早鸟价 ¥99,通过我的海报买,返你 ¥24

到手价 ¥75 ,明晚 24 点恢复原价 ¥129


?需要的朋友别错过,扫码订阅?

640?wx_fmt=png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值