【问题标题】:Does reducing the number of executor-cores consume less executor-memory?减少执行器核心的数量会消耗更少的执行器内存吗?
【发布时间】:2019-04-29 17:31:49
【问题描述】:

我的 Spark 作业因 YARN 错误 Container killed by YARN for exceeding memory limits 10.0 GB of 10 GB physical memory used 而失败。

直觉上,我将核心数量从5 减少到1,作业运行成功。

我没有增加 executor-memory,因为 10g 是我的 YARN 集群的最大值。

我只是想确认一下我的直觉。减少executor-cores 的数量会减少executor-memory 的消耗吗?如果有,为什么?

【问题讨论】:

  • 执行器核心数指定每个执行器可以运行多少个作业。因此,当您有 5 个核心时,每个执行器尝试最多同时运行 5 个作业。如果每个作业都试图达到 10g,那么您将尝试将 50g 的 RAM 用于单个作业。通过将内核数量减少到 1,每个执行程序将仅使用 10g RAM。 mapr.com/blog/resource-allocation-configuration-spark-yarn
  • @bogertron 我认为情况正好相反——每个执行程序的核心数量将共享executor-memory。例如,在我原来的情况下,如果 executor-memory10g 并且 exectuor-cores 是 5,那么所有 5 个内核将共享 10g 内存。这是一个公平的说法吗?
  • 我很抱歉,你是对的。至于您提出的问题,您最多运行 5 个并行计算(或线程)。即使您尝试跨线程共享内存,在为执行程序分配的内存空间中每个正在运行的任务也会有额外的开销
  • 集群中有多少个节点?你设置num-executors了吗?

标签: apache-spark hadoop-yarn


【解决方案1】:
spark.executor.cores = 5, spark.executor.memory=10G

这意味着一个执行器可以并行运行 5 个任务。这意味着 10 GB 需要由 5 个任务共享。因此平均而言有效 - 每个任务将有 2 GB 可用。如果所有任务消耗超过 2 GB,那么整个 JVM 最终将消耗超过 10 GB,因此 YARN 将杀死容器。

spark.executor.cores = 1, spark.executor.memory=10G

这意味着执行器只能运行 1 个任务。这意味着 10 GB 完全可用于 1 个任务。因此,如果任务使用超过 2 GB 但小于 10 GB,它将正常工作。你的 Job 就是这种情况,所以它奏效了。

【讨论】:

    【解决方案2】:

    是的,每个 executor 使用额外 7% 的 memoryOverhead。

    创建此计算时会认为您有两个节点,因此我们在一个节点中有三个执行器,在另一个节点中有两个执行器。

    Memory per executor in the first node = 10GB/3 = 3,333GB
    Counting off heap overhead = 7% of 3,333GB = 0,233GB. 
    
    So, your executor-memory should be 3,333GB - 0,233GB = 3,1GB per node
    

    您可以在此处阅读另一种解释: https://spoddutur.github.io/spark-notes/distribution_of_executors_cores_and_memory_for_spark_application.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 2022-12-07
      • 2016-05-24
      • 2013-06-13
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多