Spark 调优

英文原文:Tuning Spark

中文原文:Spark调优
Advanced Garbage Collection(GC) Tuning
JVM内存管理的一些基本知识:

  • Java的Heap(堆)空间分为2部分:Young (新生代)和Old(老生代)。Young generation用来保存生命周期较短的对象(short-lived objects),Old generation用于保存生命周期较长的对象。
  • Young generation进一步分成三部分:[Eden, Survivor1, Survivor2]
  • 内存回收过程的简要描述:当Eden满的时候,就在Eden执行minor GC,并将Eden和Survivor1中活跃的对象copied to Survivor2.The Survivor regions are swapped.(然后将Survivor1和Survivor2交换),如果对象活跃的时间足够长或者Survivor2 is full,则会将该对象copied to Old. 最终,如果Old is close to full, a full GC invoked.

GC tuning in Spark的目标是确保只有长时间存活的RDD才保存到Old generation, 同时,Young generation区域足够大以保存生命周期较短的对象,这样,在任务执行期间可以避免执行full GC. 下面是一些可能有用的执行步骤:

  • 通过收集GC stats 检查内存回收是否太过频繁,如果在任务结束之前执行了很多次full GC, 则表明任务执行的内存空间不足。
  • 在打印的GC stats中,如果OldGen接近消耗殆尽,那么较少用于caching的memory,这可以通过spark.storage.memoryFraction属性设置。

spark.executor.memory决定了每个Executor可用内存的大小,而spark.storage.memoryFraction则决定了在这部分内存中有多少可以用于Memory Store管理RDD Cache数据,剩下的内存用来保证任务运行时各种其它内存空间的需要。

spark.executor.memoryFraction默认值为0.6,即60%的内存用来caching,40%的内存用来计算。官方文档建议这个比值不要超过JVM Old Gen区域的比值。这也很容易理解,因为RDD Cache数据通常都是长期驻留内存的,理论上也就是说最终会被转移到Old Gen区域(如果该RDD还没有被删除的话),如果这部分数据允许的尺寸太大,势必把Old Gen区域占满,造成频繁的FULL GC。

如何调整这个比值,取决于你的应用对数据的使用模式和数据的规模,粗略的来说,如果频繁发生Full GC,可以考虑降低这个比值,这样RDD Cache可用的内存空间减少(剩下的部分Cache数据就需要通过Disk Store写到磁盘上了),会带来一定的性能损失,但是腾出更多的内存空间用于执行任务,减少Full GC发生的次数,反而可能改善程序运行的整体性能

  • 如果有过多的minor GC而不是full GC,那么可以为Eden分配更大的内存 。如果Eden的大小为E,那么可以通过设置-Xmn = 4/3 *E (将内存扩大到4/3是考虑到survivor所需要的空间)
  • 举一个例子,㘝任务从HDFS读取数据,那么任务所需要的内存空间可以从读取的block数量估算出来。解压后的block通常为解压前的2-3倍,所以,如果同时执行3-4个任务,block的大小为64M,我们可以估算出Eden的大小为4*3*64MB
  • 监控随着参数的改变,内存回收频率的频率以及消耗的时间的改变。
  • 网上还有很多其他的优化选项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值