【发布时间】:2020-12-13 02:31:36
【问题描述】:
在 SO 中多次询问 Spark 内存开销相关问题,我经历了其中的大部分。但是,在浏览了多个博客之后,我感到困惑。
以下是我的问题
- 内存开销是执行程序内存的一部分还是属于 分离?由于很少有博客说内存开销是 执行者内存和其他人说执行者内存+内存 开销(这意味着内存开销不是执行程序的一部分 内存)?
- 内存开销和堆外溢出是否相同?
- 如果我没有提到开销作为 spark-submit,它会采用默认 18.75 还是不会?
- 如果我们提供比默认值更多的内存开销,会有任何副作用吗?
https://docs.qubole.com/en/latest/user-guide/engines/spark/defaults-executors.html https://spoddutur.github.io/spark-notes/distribution_of_executors_cores_and_memory_for_spark_application.html
以下是我想了解的情况。 我有 5 个节点,每个节点 16 个 vcore 和 128GB 内存(其中 120 个可用),现在我想提交 spark 应用程序,下面是 conf,我在想
Total Cores 16 * 5 = 80
Total Memory 120 * 5 = 600GB
案例1:执行器内存的Memory Overhead部分
spark.executor.memory=32G
spark.executor.cores=5
spark.executor.instances=14 (1 for AM)
spark.executor.memoryOverhead=8G ( giving more than 18.75% which is default)
spark.driver.memoryOverhead=8G
spark.driver.cores=5
案例 2:内存开销不是执行程序内存的一部分
spark.executor.memory=28G
spark.executor.cores=5
spark.executor.instances=14 (1 for AM)
spark.executor.memoryOverhead=6G ( giving more than 18.75% which is default)
spark.driver.memoryOverhead=6G
spark.driver.cores=5
根据下面的视频,我正在尝试使用 85% 的节点,即 120GB 中的大约 100GB,不确定我们是否可以使用更多。
https://www.youtube.com/watch?v=ph_2xwVjCGs&list=PLdqfPU6gm4b9bJEb7crUwdkpprPLseCOB&index=8&t=1281s (4:12)
【问题讨论】:
-
内存开销是执行器内存的一部分还是单独的?是的......在资源管理器中启动容器以便在其中执行执行程序。所以基本上执行器内存 + 内存开销 = 容器内存 ..... spark 在应用程序内存和缓存内存中破坏了执行器内存
-
和执行器内存开销包括堆外内存和缓冲区以及用于运行容器特定线程的内存。
-
如果我在 spark-submit 中没有提到开销会发生什么,它会采用默认值吗?如果没有明确提及,资源管理器会使用默认值计算内存开销值。跨度>
-
Total Cores 16 * 5 = 80 Total Memory 120 * 5 = 600GB ......您应该始终为在该节点上运行的操作系统保留内核和内存,为 nodemanager 和 1 个内核保留1 个核心供其他守护程序使用,2 个核心供操作系统以最佳方式工作
-
假设 12*5 = 60 和总内存 116*5 = 580GB 是可用的总资源......然后你相应地调整其他参数......
标签: apache-spark pyspark hadoop-yarn executor memory-overhead