Spark内存分数与年轻一代/老一代java堆拆分
Posted
技术标签:
【中文标题】Spark内存分数与年轻一代/老一代java堆拆分【英文标题】:Spark memory fraction vs Young Generation/Old Generation java heap split 【发布时间】:2020-08-24 16:45:40 【问题描述】:我正在研究 Spark,我对 Executor 内存拆分有一些疑问。具体来说,在 Spark Apache 文档 (here) 中声明:
Java Heap 空间分为 Young 和 Old 两个区域。年轻人 generation 是为了保存短暂的对象,而 Old 生成适用于具有较长生命周期的对象。
这个:
但对于 Spark Executor,内存还有另一个抽象拆分,如 spark apache doc (here) 所述:
Spark 中的内存使用主要属于以下两类之一: 执行和存储。执行内存是指用于 混洗、连接、排序和聚合中的计算,同时存储 内存是指用于缓存和传播内部数据的内存 跨集群。在 Spark 中,执行和存储共享一个统一的 地区 (M)。
如下图:
我不明白 Young Gen\Old gen 如何与存储\执行内存重叠,因为在同一个文档 (always here) 中声明:
spark.memory.fraction 将 M 的大小表示为 (JVM 堆空间 - 300MiB)(默认 0.6)。其余空间 (40%) 为 Spark 中的用户数据结构、内部元数据和 在稀疏和异常情况下防止OOM错误 大型记录。
其中spark.memory.fraction
代表Java Heap的执行\存储内存部分
但是
如果 OldGen 快满了,减少使用的内存量 通过降低 spark.memory.fraction 进行缓存;最好缓存 对象数量少于减慢任务执行速度。
这似乎暗示 oldgen 实际上是用户记忆,但下面的陈述似乎与我的假设相矛盾
如果 OldGen 快满了,或者考虑减小年轻代的大小。
我没看到什么?
Young Gen\Old Gen 分裂与 spark 分数 \User Memory 有什么关系?
【问题讨论】:
我不明白Young Gen\Old gen是如何与存储\执行内存重叠 ...这些是堆内存上的垃圾收集提供的概念(这些是部分堆内存的垃圾内存查看)......火花执行器内存(相同的堆内存)非常简单=应用程序内存+缓存内存。 ...就像这两个应用程序(spark 和 GC)在各自方面看到相同的堆内存.. 【参考方案1】:简短的回答是,除了与 JVM 堆有关之外,它们并没有真正的关系。
更好的想法是有四个桶(编号不分先后):
-
激发年轻一代的记忆
旧世代中的火花记忆
年轻一代的用户记忆
老一代的用户记忆
(从技术上讲,还有一些既不是 Spark 也不是 User 的系统内存,但这通常足够小而不必担心:这也可能是旧的或年轻的)。
对象归类为 Spark 还是 User 由 Spark 决定(我其实不知道这是否是一个永恒的名称,或者对象是否可以在这方面改变它们的分类)。
对于old 与young,这是由垃圾收集器管理的,GC 可以并将对象从young 提升到old。在一些 GC 算法中,世代的大小是动态调整的(或者它们使用固定大小的区域,并且给定的区域可以是老的或年轻的)。
您可以控制 1+2、3+4、1+3 和 2+4 的总容量,但您实际上并没有(并且可能并不真正想要,因为这样做有很多好处)能够在一个类别中使用多余的空间来临时在另一个类别中获得更多空间)控制 1、2、3 或 4 的容量。
【讨论】:
以上是关于Spark内存分数与年轻一代/老一代java堆拆分的主要内容,如果未能解决你的问题,请参考以下文章
Spark学习之路 SparkCore的调优之资源调优JVM的基本架构