gpt4 book ai didi

apache-spark - Spark中执行程序和任务的内存分配

转载 作者:行者123 更新时间:2023-12-03 19:37:36 25 4
gpt4 key购买 nike

我的集群配置如下:-
7 个节点,每个节点具有 32 个内核和 252 GB 内存。

yarn 配置如下:-

yarn.scheduler.maximum-allocation-mb - 10GB
yarn.scheduler.minimum-allocation-mb - 2GB
yarn.nodemanager.vmem-pmem-ratio - 2.1
yarn.nodemanager.resource.memory-mb - 22GB
yarn.scheduler.maximum-allocation-vcores - 25
yarn.scheduler.minimum-allocation-vcores - 1
yarn.nodemanager.resource.cpu-vcores - 25

map 减少配置如下: -
mapreduce.map.java.opts - -Xmx1638m
mapreduce.map.memory.mb - 2GB
mapreduce.reduce.java.opts - -Xmx3276m
mapreduce.reduce.memory.mb - 4Gb

Spark 配置如下:-
spark.yarn.driver.memoryOverhead 384
spark.yarn.executor.memoryOverhead 384

现在我尝试通过将值设置为 master yarn 和不同的 executor-memory、num-executors、executor-cores 值来运行 spark-shell。
  • spark-shell --master yarn --executor-memory 9856M --num-executors 175 --executor-cores 1

  • 在这种情况下,执行器内存 + 384 不能超过 yarn 调度程序的最大 10GB。所以在这种情况下 9856M + 384 MB = 10GB 所以它工作正常。现在,一旦 spark shell 启动,执行程序的总数为 124,而不是 175。每个执行程序的 spark shell 启动日志或 Spark UI 中的存储内存为 6.7 GB(即 10GB 的 67%)。

    spark shell 进程的顶部命令输出如下:-
    PID     USER      PR    NI  VIRT  RES   SHR S  %CPU %MEM  TIME+  
    8478 hdp66-ss 20 0 13.5g 1.1g 25m S 1.9 0.4 2:11.28

    所以虚拟内存是13.5G,物理内存是1.1g
  • spark-shell --master yarn --executor-memory 9856M --num-executors 35 --executor-cores 5

  • 在这种情况下,执行器内存 + 384 不能超过 yarn 调度程序的最大 10GB。所以在这种情况下 9856M + 384 MB = 10GB 所以它工作正常。现在,一旦 spark shell 启动,执行程序的总数为 35。在每个执行程序的 spark shell 启动日志或 Spark UI 中看到的存储内存为 6.7 GB(即 10GB 的 67%)。

    spark shell 进程的顶部命令输出如下:-
    PID     USER      PR    NI  VIRT  RES   SHR S  %CPU %MEM  TIME+  
    5256 hdp66-ss 20 0 13.2g 1.1g 25m S 2.6 0.4 1:25.25

    所以虚拟内存是13.2G,物理内存是1.1g
  • spark-shell --master yarn --executor-memory 4096M --num-executors 200 --executor-cores 1

  • 在这种情况下,执行器内存 + 384 不能超过 yarn 调度程序的最大 10GB。所以在这种情况下 4096M + 384 MB = 4GB 所以它工作正常。现在,一旦 spark shell 启动,执行程序的总数为 200。在每个执行程序的 spark shell 启动日志或 Spark UI 中看到的存储内存为 2.7 GB(即 4GB 的 67%)。

    spark shell 进程的顶部命令输出如下:-
    PID     USER      PR    NI  VIRT  RES   SHR S  %CPU %MEM  TIME+  
    21518 hdp66-ss 20 0 19.2g 1.4g 25m S 3.9 0.6 2:24.46

    所以虚拟内存是19.2G,物理内存是1.4g。

    那么有人可以解释一下这些内存和执行器是如何启动的。为什么在 spark UI 上看到的内存是请求的执行程序内存的 67%?以及如何为每个执行程序决定虚拟和物理内存。

    最佳答案

    Spark 几乎总是分配 65% 到 70% 的用户为执行程序请求的内存。 Spark 的这种行为是由于 SPARK JIRA TICKET "SPARK-12579" .

    This link is to the scala file located in the Apache Spark Repository that is used to calculate the executor memory among other things.

        if (conf.contains("spark.executor.memory")) {
    val executorMemory = conf.getSizeAsBytes("spark.executor.memory")
    if (executorMemory < minSystemMemory) {
    throw new IllegalArgumentException(s"Executor memory $executorMemory must be at least " +
    s"$minSystemMemory. Please increase executor memory using the " +
    s"--executor-memory option or spark.executor.memory in Spark configuration.")
    }
    }
    val usableMemory = systemMemory - reservedMemory
    val memoryFraction = conf.getDouble("spark.memory.fraction", 0.6)
    (usableMemory * memoryFraction).toLong

    }

    上面的代码对你看到的行为负责。对于集群可能没有用户请求的内存的情况,这是一种安全措施。

    关于apache-spark - Spark中执行程序和任务的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46233359/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com