Spark中的垃圾回收调优: 如何估计Eden的大小?

3
我正在阅读比尔•钱伯斯和马泰•扎哈里亚的《Spark权威指南》中有关垃圾回收调优的内容。本章节主要基于Spark官方文档。尽管如此,作者还通过一个示例来扩展文档,介绍如何处理大量的小型垃圾回收而不是大量的主要垃圾回收。
官方文档和书中都指出:
如果有太多的小型垃圾回收而不是许多主要GC,则为Eden分配更多内存会有所帮助。您可以将Eden的大小设置为每个任务需要的内存量的过度估计值。如果确定Eden的大小为E,则可以使用选项-Xmn = 4/3 * E来设置Young generation的大小。(乘以4/3是为了考虑到survivor regions使用的空间。)(请参见此处
该书提供了一个示例(第一版,第324页)。
如果你的任务是从HDFS读取数据,那么任务使用的内存量可以通过使用从HDFS读取的数据块的大小来估计。请注意,解压缩块的大小通常是块的两到三倍。因此,如果您想要三到四个任务的工作空间,并且HDFS块大小为128 MB,则我们可以估计Eden的大小为43,128 MB。
假设每个未压缩块的大小都是512 MB,我们有4个任务,并且我们按4/3进行缩放,我真的不明白您如何得出Eden需要43,128 MB的估计值。
根据本书的假设,我认为大约3 GB的Eden应该足够了。
有人能解释一下应该如何计算这个估计值吗?

你真的遇到了这个问题吗?如果是的话,就发一下GC日志,而不是引用一本书。 - the8472
不是。只是想知道所提供的估计是否准确。直觉上,它被高估了很多。 - Wojciech Walczak
1个回答

1

好的,我认为新的Spark文档已经讲得很清楚了:

例如,如果您的任务是从HDFS读取数据,则可以使用从HDFS读取的数据块的大小来估计任务使用的内存量。请注意,解压缩块的大小通常是块大小的2或3倍。因此,如果我们希望有3或4个任务的工作空间,并且HDFS块大小为128 MB,则可以估计Eden的大小为4 * 3 * 128MB。

因此,它是4*3*128 MB而不是书中所说的(即43,128 MB)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接