You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark内存模型技术问询:JVM、执行/存储/池内存等问题

Spark Executor内存相关问题解答

问题背景

我有一个磁盘大小为9.5GB的非小型DataFrame,对其中一列分别加1和2生成新列,随后通过foreach触发执行,代码如下:

df_sales = df_sales.withColumns({'order_id_a1':df_sales.order_id+1,'order_id_a2':df_sales.order_id+2})

df_sales.foreach(lambda x:None)

Spark Web UI的Executor级别摘要如图所示,现提出以下技术问题:

  • Peak execution memory定义为Shuffle、聚合、Join过程中创建的内部数据结构(如AppendOnlyMap)使用的最大内存。但我仅对列做加法操作,该操作会占用哪部分内存?另外,execution memory offHeap是什么?
  • 我未调用persist方法,但Storage Memory仍被占用。文档提到存储内存也用于在集群间传播内部数据,此场景下对应的内部数据实例是什么?
  • 每个Executor读取约750MiB数据,按128MiB块分区,这些块会占用内存的哪一部分(执行、存储、预留、堆外、开销)?
  • Peak JVM Memory是否指JVM在任意时刻使用的最大内存?即堆上Peak JVM Memory = max(execution+storage+reserved),堆外Peak JVM Memory = max(pyspark memory + offHeap + overhead)?若如此,为何堆上峰值为1.1GiB,而Peak execution为0、预留内存300、Peak storage为502.2KiB,数值不匹配?
  • Pool Memory(Direct/Mapped)是什么?

问题解答

1. 列加法操作的内存占用与execution memory offHeap说明

列加法属于窄依赖的逐行转换,实际执行时,每个分区的行数据会被加载到**执行内存(execution memory)**中完成计算。你看到UI里Peak execution显示为0,大概率是这类轻量操作的内存占用极低,没达到UI的统计阈值,或者统计延迟导致的。

execution memory offHeap指的是Spark在JVM堆之外的系统内存中分配的执行内存,专门用来存储执行过程中的数据结构,目的是减少JVM GC的压力,需要通过spark.memory.offHeap.enabled等参数开启后才会生效。

2. 未调用persist但Storage Memory被占用的原因

这里占用Storage Memory的是从数据源读取的分区临时数据块。Spark的存储内存不仅用来保存用户主动persist的RDD/DF,还会临时缓存从外部数据源(比如磁盘)读取的块数据,供任务执行时使用,任务完成后这些数据会被自动清理,这就是文档提到的“集群间传播内部数据”对应的实例。

3. 读取的分区块内存归属

每个Executor读取的128MiB分区块,首先会被加载到Storage Memory中作为临时缓存。执行加法操作时,数据会被临时复制到执行内存中计算,但主要的存储载体还是Storage Memory。如果Storage Memory不足,这些块会被溢写到磁盘。

4. Peak JVM Memory的计算与数值不匹配问题

Peak JVM Memory确实是JVM在任意时刻的最大内存使用量,但你的计算公式不对——堆上的Peak JVM Memory除了execution、storage、reserved内存,还包含JVM自身的运行开销(比如类加载器、线程栈、内部系统对象),以及Spark任务执行时产生的临时对象、序列化缓冲等未被归类到execution/storage的内存消耗。

你看到的数值不匹配,就是这些额外开销导致的:JVM本身运行就需要占用几百MB内存,加上任务执行时的临时对象,堆上峰值自然会达到1.1GiB,而你的操作是轻量的,execution和storage的占用极低,所以两者看起来不匹配。

5. Pool Memory(Direct/Mapped)的含义

  • Direct Memory Pool:JVM的直接内存池,这部分内存不在JVM堆内,是直接向操作系统申请的,主要用于NIO操作(比如文件读写、网络传输),Spark用它存储序列化数据、shuffle缓冲等,能有效减少堆内存的GC压力。
  • Mapped Memory Pool:内存映射文件的内存池,Spark用它处理大文件读取,通过内存映射把文件内容直接映射到内存中,避免数据拷贝,提升IO效率,常见于读取外部数据源的场景。

内容的提问来源于stack exchange,提问作者figs_and_nuts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:45:25