Spark内存开销

9

在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内存(其中120GB可用),现在我想提交Spark应用程序,下面是我考虑的配置。

Total Cores 16 * 5 = 80
Total Memory 120 * 5 = 600GB

案例1:执行器内存中的内存开销部分。
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%,即约100GB,不确定是否可以使用更多。 https://www.youtube.com/watch?v=ph_2xwVjCGs&list=PLdqfPU6gm4b9bJEb7crUwdkpprPLseCOB&index=8&t=1281s(4:12)

1
内存开销是执行器内存的一部分还是单独的部分?是的...资源管理器启动容器以便在其中执行执行器。因此,基本上执行器内存+内存开销=容器内存......Spark将执行器内存分成应用程序内存和缓存内存。 - kavetiraviteja
2
执行器内存开销包括堆外内存以及缓冲区和用于运行容器特定线程的内存。 - kavetiraviteja
2
如果我在spark-submit中没有提到开销,会发生什么?它会采用默认值吗?如果没有明确提到,资源管理器将使用默认值计算内存开销值。 - kavetiraviteja
2
总核心数为16 * 5 = 80 总内存为120 * 5 = 600GB......您应该始终为运行在该节点上的操作系统和1个nodemanager保留核心和内存,以及为其他守护程序保留1个核心,为操作系统保留2个核心以实现最佳工作状态。 - kavetiraviteja
2
假设125=60且总内存1165=580GB是可用的总资源...那么你需要相应地调整其他参数... - kavetiraviteja
显示剩余2条评论
1个回答

11

回答您的问题,内存开销是否属于执行内存还是单独的内存开销不是执行内存的一部分。

资源管理器启动容器以执行其中的执行程序。因此,执行内存 + 内存开销 = 容器内存......Spark将执行内存分解为应用程序内存和缓存内存。

执行内存开销主要包括堆外内存、nio缓冲区和运行特定容器线程(线程堆栈)所需的内存。 当您未指定内存开销时,资源管理器通过使用默认值计算内存开销值,并相应地启动容器。

始终建议为操作系统保留核心和内存(即节点管理器的1个核心和其他守护程序的1个核心以及操作系统的2个核心以使其正常工作)

您可以像下面提到的那样更改计算 12 * 5 = 60核,总内存116 * 5 = 580GB是可用的总资源..然后您相应地调整其他参数。


执行者内存开销在3.x版本中不包括堆外内存。根据文档:“容器运行执行者的最大内存大小是由spark.executor.memoryOverhead、spark.executor.memory、spark.memory.offHeap.size和spark.executor.pyspark.memory的总和确定的。” - figs_and_nuts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接