为什么 YARN 上驱动程序和执行程序的内核数量与请求的数量不同?

lea*_*man 3 hadoop-yarn apache-spark

我在集群模式下部署了一个 Spark 作业,如下所示

驱动程序核心 - 1
Executor cores - 2 执行程序
数量 - 2。

我的理解是这个应用程序应该占据集群中的 5 个核心(4 个执行程序核心和 1 个驱动程序核心),但我没有在 RM 和 Spark UI 中观察到这一点。

  1. 在资源管理器 UI 上,我只看到用于此应用程序的 4 个内核。
  2. 即使在 Spark UI 中(单击来自 RM 的 ApplicationMaster URL),在 executors 选项卡下,驱动程序内核也显示为零。

我错过了什么吗?

集群管理器是 YARN。

Jac*_*ski 5

我的理解是这个应用程序应该在集群中占用5个内核(4个执行器内核和1个驱动程序内核)

这是YARN 中的完美情况,它可以为您提供 5 个内核而不是它管理的 CPU。

但我没有在 RM 和 Spark UI 中观察到这一点。

由于完美的情况不会经常发生,因此我们可以从 YARN 获得尽可能多的内核,这样 Spark 应用程序就可以启动。

Spark 可以无限期地等待请求的内核,但这并不总是符合您的喜好,不是吗?

这就是为什么在 YARN 上的 Spark 有一个额外的检查(又名minRegisteredRatio),它是在应用程序开始执行任务之前请求的最少80%的内核。您可以使用spark.scheduler.minRegisteredResourcesRatioSpark 属性来控制比率。这将解释为什么您看到使用的内核少于请求的内核。

引用官方 Spark 文档(突出显示我的):

spark.scheduler.minRegisteredResourcesRatio

0.8 YARN 模式

注册资源的最小比例(注册资源/总预期资源)(资源为yarn模式下的executor,standalone模式下和Mesos粗粒度模式下的CPU核数['spark.cores.max'值是Mesos粗粒度模式下的总预期资源-粒度模式] ) 在调度开始之前等待。指定为介于 0.0 和 1.0 之间的双精度值。无论是否达到最小资源比例,调度开始前等待的最长时间由 config 控制spark.scheduler.maxRegisteredResourcesWaitingTime