当前位置: 首页 > 知识库问答 >
问题:

如何计算/供应EMR上的Spark内存?

轩辕欣可
2023-03-14

--Executor-Cores 5--Executor-Memory 35GB--num-Executors 6--conf spark.dynamicallocation.enabled=false

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

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

共有1个答案

酆阳煦
2023-03-14

这是由于spark内存管理。

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

默认情况下,Spark只使用堆内内存。当Spark应用程序启动时,堆上内存的大小由-executor-memory或Spark.executor.memory参数配置。在Executor中运行的并发任务共享JVM的堆内存。

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.

有关更多信息:

  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

您需要检查yar-site.xml文件中的yarn.nodemanager.resource.memory-mb。它表示“单个NodeManager可以在一个节点上的所有容器中分配的总内存”。可能是纱线没有给出盒子中所有可用的内存。因此,火花是无法谈判的6个执行者。

还有一件事,spark.yarn.executor.memoryeadhead被设置为每个执行器384MB,除非它被重写。这需要添加到计算中。

有关更多信息

  1. Apache Spark:设置执行器实例不会更改执行器
    null
 类似资料:
  • 我有一个新手火花问题。下面是我试图执行的程序: 我试图做的计算(doComput)是昂贵的,因为内存限制,我决定将数据集重新分区为7000个分区(即使我有1200个执行器,所以一次只能执行1200个)。然而,在完成计算后,我尝试写入s3,它大部分工作正常,但很少有任务最终超时,工作被重试。 1) 为什么在我保存在进行昂贵计算后生成的RDD时,整个作业都会被重试? 2) 我试图在持久化之后合并,但s

  • 我试图在AWS EMR上运行一个Spark应用程序。我遵循http://blogs.aws.amazon.com/bigdata/post/tx15ay5c50k70rv/installing-apache-spark-on-an-amazon-emr-cluster的说明 我从S3中加载fat-jar(通过执行“SBT Assembly”获得)和应用程序所需的输入文件。我在Spark-1.1.0

  • 我有一个rdd(String,Int),它是按键排序的 现在,我想用零开始第一个键的值,并将后续键作为前一个键的和。 例如:c1=0,c2=c1的值,c3=(c1值c2值),c4=(c1..c3值)预期输出: 有可能做到这一点吗?我用地图试过了,但总和没有保存在地图里。

  • 当我使用spark API运行类似的代码时,它在许多不同的(分布式)作业中运行,并且成功运行。当我运行它时,我的代码(应该做与Spark代码相同的事情),我得到一个堆栈溢出错误。知道为什么吗? 代码如下: 我相信我正在使用与spark相同的所有并行化工作,但它对我不起作用。任何关于使我的代码分发/帮助了解为什么在我的代码中发生内存溢出的建议都将是非常有帮助的

  • 对我来说,非常奇怪的是jmeter没有为RestCall带来响应时间。 这些都可能保存在JTL/CSV文件中: 我的问题是,如果响应时间等于上面的一个数据,或者我是否可以手动计算和一些值并得到它。 PS:我之所以没有简单地使用Jmeter响应时间图,是因为我将数据发送到Datadog(度量工具)。

  • 我在AWS EMR Spark上运行一个应用程序。这里,是spark提交作业- 所以,AWS使用YARN进行资源管理。当我观察云观察指标时,我对此有几个疑问:- 这里分配的容器意味着什么?我正在使用1 master 我将查询更改为:- 这里运行的内核数是3。不应该是3(执行器数)*4(内核数)=12吗?