【发布时间】: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)在各自方面看到相同的堆内存..
标签: java scala apache-spark heap-memory