Spark 和 Yarn 的资源分配

Posted

技术标签:

【中文标题】Spark 和 Yarn 的资源分配【英文标题】:Resource Allocation with Spark and Yarn 【发布时间】:2018-12-07 09:37:22 【问题描述】:

我在纱线客户端模式下使用 Zeppelin 0.7.3 和 Spark 2.3。 我的设置是:

火花:

spark.driver.memory             4096m
spark.driver.memoryOverhead         3072m
spark.executor.memory           4096m
spark.executor.memoryOverhead           3072m
spark.executor.cores                3
spark.executor.instances            3

纱线:

Minimum allocation: memory:1024, vCores:2
Maximum allocation: memory:9216, vCores:6
The application started by Zeppelin gets the following resources:
Running Containers      4
Allocated CPU VCores        4
Allocated Memory MB 22528

    我不太了解 yarn 分配的内存量。鉴于设置, 我假设纱线会保留 (4096+3072)*4m = 28672m。然而,它看起来像 spark.executor.memoryOverhead 选项被忽略(我也试过 spark.yarn.executor.memoryOverhead 没有效果)。因此,最小的 384m 被分配为开销。作为最低分配 设置为 1024m,我们最终得到 (4096+3072)*1m + (4096+1024)*3m=22528m,其中第一项是 驱动程序和第二项总结了执行程序的内存。

    为什么只分配了 4 个 CPU VCore,即使我要求更多并且最小分配是 设置为 2,我要求更多的核心?在查看 Application Master 时,我发现了以下 executor:

在这里,执行器确实每个有 3 个核心。我怎么知道哪个值是正确的或什么 我失踪了吗?

    我尝试了一些设置,在 yarn-client 模式下我应该使用诸如 spark.yarn.am.memory 或 spark.yarn.am.cores。但是,似乎这些被纱线忽略了。 为什么会这样?此外,在 yarn-client 模式下,驱动程序应该在外部运行 纱线。为什么资源仍然在 yarn 内部分配?我的 Zeppelin 在同一台机器上运行 作为一名工人。

【问题讨论】:

【参考方案1】:

一个 Spark 应用程序具有三个角色:驱动程序、应用程序主机和执行程序。

    在客户端模式(部署模式之一)下,驱动程序本身不会向纱线请求资源,因此我们有一个应用程序主控器,三个执行器,这些资源必须由 YARN 分配。所以我认为 spark 会要求 (4G + 3G) * 3 三个 executors 和 1G for am。所以Allocated Memory 将增加 22GB(22528MB)。

    至于核心数,我认为 Spark UI 给出了正确答案,因为我的经验。

【讨论】:

以上是关于Spark 和 Yarn 的资源分配的主要内容,如果未能解决你的问题,请参考以下文章

Spark和YARN

Spark On YARN

yarn和mapreduce资源调优

spark系统实现yarn资源的自动调度

关于Spark on Yarn的资源分配与Capacity Scheduler的研究

关于Spark on Yarn的资源分配与Capacity Scheduler的研究