EMR calculated/provisioned 上 Spark 的内存如何?

How is memory for Spark on EMR calculated/provisioned?

我是 运行 使用 YARN 的 EMR 上的 Spark 作业,不了解 UI 中的内存配置和报告。我有一个主节点和一个核心节点实例 r4.8xlarge,它应该有 32 个核心和 244 GB 内存。根据此 doc, it should have 241 GB allocated to YARN. Looking at the UI, this number is 236 GB probably due to additional overheads. Based on best practices,我已将作业配置为具有以下配置。

--executor-cores 5 --executor-memory 35GB --num-executors 6 --conf spark.dynamicAllocation.enabled=false

计算执行器内存(236 GB / 6 个执行器)* 0.9 = 35 GB

当我提交 Spark 作业并查看 Spark UI 或执行器指标的控制台时,数字非常不同,我对如何计算和配置这些数字感到困惑。而不是 6 个执行器,只有 4 个,这导致作业只使用 20 个内核而不是可用的 30 个。每个执行器的内存量是 22.2 GB 而不是 35 GB,在可用的 236 GB 总量中只有 88 GB .

我看了很多资源,但他们只谈论如何通过设置 YARN 和 Spark 配置来调整 spark 作业,我已经遵循了这些,但结果出乎意料。

谁能帮忙解释一下?

编辑:集群上安装的唯一应用程序是 Spark 和 Hadoop。

内存

这是由于 spark 内存管理。

引用自:https://www.tutorialdocs.com/article/spark-memory-management.html

默认情况下,Spark 仅使用堆内存。 On-heap memory的大小由Spark Application启动时的–executor-memory或spark.executor.memory参数配置。 Executor 中的并发任务 运行 共享 JVM 的 On-heap 内存。

Executor中的On-heap内存区域大致可以分为以下四块:

Storage Memory: It's mainly used to store Spark cache data, such as RDD  
 cache, Broadcast variable, Unroll data, and so on.

Execution Memory: It's mainly used to store temporary data in the calculation 
 . process of Shuffle, Join, Sort, Aggregation, etc.

User Memory: It's mainly used to store the data needed for RDD conversion  
 operations, such as the information for RDD dependency.

Reserved Memory: The memory is reserved for system and is used to store 
Spark's internal objects.

您在仪表板中看到的可用内存是已分配内存的 75%。

每个执行程序的总分配内存可能因节点中的可用内存而异。确切的 236GB 可能不适用于 yarn。数据节点进程等可能会占用更多内存。

你看到的内存就是存储内存。存储内存 + 执行内存 = 分配的总内存的 75%。

更多信息:

  1. https://databricks.com/session/deep-dive-apache-spark-memory-management
  2. https://0x0fff.com/spark-memory-management/
  3. https://www.tutorialdocs.com/article/spark-memory-management.html

执行者数

你需要检查yarn-site.xml文件中的yarn.nodemanager.resource.memory-mb。它表示 "the total memory that a single NodeManager can allocate across all containers on one node"。可能是纱线没有提供盒子中所有可用的内存。因此,spark 无法协商 6 个执行者。

还有一件事 spark.yarn.executor.memoryOverhead 设置为每个执行程序 384MB,除非它被覆盖。这个需要加进去计算。

了解更多信息

如何UI计算内存