【问题标题】:How spark manages physical memory, virtual memory and executor memory?spark如何管理物理内存、虚拟内存和执行器内存?
【发布时间】: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


【解决方案1】:

当你看到选项值时,

yarn.nodemanager.vmem-pmem-ratio    2.1

物理内存和虚拟内存的默认比例是2.1。您可以通过纱线资源管理器的总内存除以容器数来计算物理内存,即没有驱动程序的执行器。

这里是article,不过以后会有更多好文章yarn如何分配物理内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-06-08
    • 1970-01-01
    • 2012-12-30
    • 2014-03-28
    • 2014-07-14
    相关资源
    最近更新 更多