为什么在 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.enabledspark.executor.instances,则关闭动态分配并使用指定数量的 spark.executor.instances
  • 一般来说,更少的内核意味着更多的执行器,但在这种情况下,您必须使用 yarn 来管理内核的数量,因为 YARN 将为您管理集群,并且默认情况下 YARN 每个执行器使用 1 个内核。

因此你得到以下内容:

scala> val numExecutors = sc.getExecutorStorageStatus.size - 1
res1 : numberExectuors : Int = 2

这意味着您实际上使用了两个执行器,每个从属一个,仅在 1 个核心上运行。