Apache spark 如何在纱线模式下通过内存设置执行器编号?

Apache spark 如何在纱线模式下通过内存设置执行器编号?,apache-spark,Apache Spark,我在r3.8XLarge集群上做了一些测试,每个实例有32个内核和244G内存 如果我设置spark.executor.cores=16,spark.executor.memory=94G,则每个实例有2个执行器,但当我将spark.executor.memory设置为大于94G时,每个实例将只有一个执行器 如果我设置spark.executor.cores=8,spark.executor.memory=35G,则每个实例有4个执行器,但当我将spark.executor.memory设置为大

我在r3.8XLarge集群上做了一些测试,每个实例有32个内核和244G内存

如果我设置spark.executor.cores=16,spark.executor.memory=94G,则每个实例有2个执行器,但当我将spark.executor.memory设置为大于94G时,每个实例将只有一个执行器

如果我设置spark.executor.cores=8,spark.executor.memory=35G,则每个实例有4个执行器,但当我将spark.executor.memory设置为大于35时,每个实例将不超过3个执行器


所以,我的问题是,执行器编号是如何通过内存集计算出来的?公式是什么?我认为Spark只是简单地使用70%的物理内存分配给执行器,但似乎我错了…

在纱线模式下,您需要按num执行器设置执行器的数量,并按执行器内存设置执行器内存。下面是一个例子:

spark-submit --master yarn-cluster --executor-memory 6G --num-executors 31 --executor-cores 32 example.jar Example
现在,每个执行器从Thread请求一个容器,该容器具有6G+内存开销和1个核心


更多信息

在纱线模式下,您需要按num executors设置executor的数量,并按executor memory设置executor memory。下面是一个例子:

spark-submit --master yarn-cluster --executor-memory 6G --num-executors 31 --executor-cores 32 example.jar Example
现在,每个执行器从Thread请求一个容器,该容器具有6G+内存开销和1个核心


更多信息

关于您看到的行为,听起来您的纱线节点管理员可用的内存量实际上小于操作系统可用的244GB。要验证这一点,请查看您的Thread ResourceManager Web UI,您可以看到集群中总共有多少内存可用。这是通过warn-site.xml中的
warn.nodemanager.resource.memory mb
确定的

回答您关于如何确定执行器数量的问题:在纱线中,如果您使用spark并将
dynamicAllocation.enabled
设置为true,则执行器的数量限制在
dynamicAllocation.minExecutors
上方和
dynamicAllocation.maxecutors
下方

除此之外,您还需要接受Thread的资源分配,对于大多数调度器来说,它将分配资源以填充作业运行的给定队列


如果您有一个完全未使用的集群,其中有一个纱线队列,并且您向其提交了一个作业,则Spark作业将继续添加具有给定核数和内存量的执行器,直到整个集群已满(或者没有足够的核/内存来分配额外的执行器).

关于您看到的行为,听起来您的纱线节点管理器可用的内存量实际上小于操作系统可用的244GB。要验证这一点,请查看您的Thread ResourceManager Web UI,您可以看到集群中总共有多少内存可用。这是通过warn-site.xml中的
warn.nodemanager.resource.memory mb
确定的

回答您关于如何确定执行器数量的问题:在纱线中,如果您使用spark并将
dynamicAllocation.enabled
设置为true,则执行器的数量限制在
dynamicAllocation.minExecutors
上方和
dynamicAllocation.maxecutors
下方

除此之外,您还需要接受Thread的资源分配,对于大多数调度器来说,它将分配资源以填充作业运行的给定队列

如果您有一个完全未使用的集群,其中有一个纱线队列,并且您向其提交了一个作业,则Spark作业将继续添加具有给定核数和内存量的执行器,直到整个集群已满(或者没有足够的核/内存来分配额外的执行器)