为什么在 EMR 上使用自定义设置会减少 spark 执行器的数量
Why is the number of spark executors reduced using custom settings on EMR
我是 运行 spark 1.6,EMR 4.3.0 上的集群模式,设置如下:
[
{
"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 个核心上运行。
我是 运行 spark 1.6,EMR 4.3.0 上的集群模式,设置如下:
[
{
"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 个核心上运行。