【发布时间】:2020-08-18 20:59:24
【问题描述】:
由于我已经在 Spark 上工作了几天,我对 Spark 内存管理感到困惑。我看到诸如物理内存、虚拟内存、执行程序内存、内存开销之类的术语,根据我目前的理解,这些值并没有正确加起来。有人可以简单地用火花来解释这些事情吗?
例如,我正在集群模式下运行具有以下配置的 spark 作业:
spark_conf = SparkConf() \
.set("spark.executor.memory", "10g") \
.set("spark.executor.cores", 4) \
.set("spark.executor.instances", 30) \
.set("spark.dynamicAllocation.enabled", False)
但我收到这样的错误:
Failing this attempt.Diagnostics: [2020-08-18 11:57:54.479]
Container [pid=96571,containerID=container_1588672785288_540114_02_000001]
is running 62357504B beyond the 'PHYSICAL' memory limit.
Current usage: 1.6 GB of 1.5 GB physical memory used;
3.7 GB of 3.1 GB virtual memory used. Killing container.
物理内存和虚拟内存分配是如何完成的 w.r.t.执行器内存和内存开销?
此外,当我在客户端模式下以相同的配置运行相同的作业时,它运行成功。为什么会这样?在客户端模式下唯一改变的是驱动程序,我没有任何代码可以将数据聚合到驱动程序。
【问题讨论】:
-
10g * 30 = 300g,你有吗?或者可能是驱动程序没有足够的内存?
-
是的,集群的总分配高达 500Gb。我尝试将驱动程序的内存从 2GB 更改为 64GB,但错误仍然存在。当我在客户端模式下运行这个作业时,我的客户端机器有 64GB 的总 RAM。
-
主要问题是为什么物理内存是 1.5GB,为什么是虚拟内存是 3.1Gb?
-
一般来说,pmem * 2.1 = vmem.
-
感谢您的信息!。但是为什么相同的驱动程序内存在客户端模式下工作,而在集群模式下却不行呢?
标签: apache-spark memory