我正在 EMR 4.3.0 上运行 Spark 1.6 集群模式,设置如下:
[
{
"classification": "spark-defaults",
"properties": {
"spark.executor.cores" : "16"
}
},
{
"classification": "spark",
"properties": {
"maximizeResourceAllocation": "true"
}
}
]
具有以下实例:
master: 1 * m3.xlarge
core: 2 * m3.xlarge
当我测试执行者的数量时:
val numExecutors = sc.getExecutorStorageStatus.size - 1
我只得到2。
spark 的 EMR 设置是否被覆盖?
最佳答案
好的,问题是:您正在设置每个执行器的核心数量,而不是执行器的数量。例如"spark.executor.cores" : "16"
.
由于您使用的是 AWS EMR,这也意味着您正在使用 YARN
.
默认情况下,执行程序实例的数量为 2(spark.executor.instances
是定义执行程序数量的属性)。
注意:
- 此属性与
spark.dynamicAllocation.enabled
不兼容。如果两者spark.dynamicAllocation.enabled
和spark.executor.instances
指定后,动态分配被关闭并且指定数量spark.executor.instances
被使用。 - 一般而言,较少的核心意味着更多的执行程序,但在这种情况下,您必须使用 yarn 管理核心数量,因为 YARN 将为您管理集群,并且默认情况下 YARN 每个执行程序使用 1 个核心。
因此你得到以下结果:
scala> val numExecutors = sc.getExecutorStorageStatus.size - 1
res1 : numberExectuors : Int = 2
这意味着您实际上使用两个执行器,每个从属一个执行器仅在 1 个核心上运行。
关于amazon-web-services - 为什么使用 EMR 上的自定义设置会减少 Spark 执行器的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427611/