【问题标题】:Spark on YARN: Less executor memory than set via spark-submitSpark on YARN:执行器内存少于通过 spark-submit 设置的内存
【发布时间】:2016-11-15 18:24:51
【问题描述】:

我在具有以下设置的 YARN 集群 (HDP 2.4) 中使用 Spark:

  • 1 个主节点
    • 64 GB RAM(48 GB 可用)
    • 12 核(8 核可用)
  • 5 个从属节点
    • 每个 64 GB RAM(48 GB 可用)
    • 每个12核(8核可用)
  • 纱线设置
    • 所有容器(一台主机)的内存:48 GB
    • 最小容器大小 = 最大容器大小 = 6 GB
    • 集群中的 vcores = 40(5 x 8 个工作器核心)
    • 最小#vcores/container = 最大#vcores/container = 1

当我使用命令 spark-submit --num-executors 10 --executor-cores 1 --executor-memory 5g ... 运行我的 spark 应用程序时,Spark 应该为每个执行程序提供 5 GB 的 RAM(由于大约 10% 的一些开销内存,我将内存设置为 5g)。

但是当我查看 Spark UI 时,我发现每个执行器只有 3.4 GB 的内存,看截图:

谁能解释为什么分配的内存这么少?

【问题讨论】:

标签: apache-spark containers hadoop-yarn hortonworks-data-platform executor


【解决方案1】:

UI 中的 storage memory 列显示了用于执行和 RDD 存储的内存量。默认情况下,这等于 (HEAP_SPACE - 300MB) * 75%。其余的内存用于内部元数据、用户数据结构和其他东西。

你可以通过设置spark.memory.fraction来控制这个数量(不推荐)。在Spark's documentation中查看更多信息

【讨论】:

  • HEAP_SPACE 是否匹配“--executor-memory”值?如果是这样,那么执行内存应该是 (5 * 1024 - 300) * 0.75 = 3615 MB,等于 3,53 GB。然后仍然有 > 0.1 GB 丢失。
  • 刚刚尝试过:将“spark.memory.fraction”设置为 0.9,这将导致 (5 * 1024 - 300) * 0.9 = 4338 MB = 4.24 GB 的执行内存。但在 Spark UI 中显示为 4.0 GB。
  • Java 程序中的堆大小不精确。当您使用-Xmx5g 向JVM 请求5g 堆时,它不会给您5 * 1024 * 1024 * 1024 字节的堆,而是一个较小的数字。检查这个答案stackoverflow.com/a/13988748/205528
  • 好的,假设“不精确系数”为 3%(1 - 5% 的中间值),那么计算结果如下:(5 * 1024 * 0.97 - 300) * 0.75 = 3500 MB = 3.42 GB。这听起来很有道理。谢谢,不知道这个Java“问题”...
猜你喜欢
  • 2017-11-18
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多