Spark 在具有多个应用程序的工作人员上运行了多少 JVM

Posted

技术标签:

【中文标题】Spark 在具有多个应用程序的工作人员上运行了多少 JVM【英文标题】:Spark how many JVMs are run on worker with multiple applications 【发布时间】:2017-05-17 10:00:52 【问题描述】:

我正在使用 Spark + 独立集群管理器。我有 5 个工作节点,每个工作节点有 2 个内核和 14 GB 的 RAM。

如何确定 Spark 将在工作节点上启动多少 JVM?

用例 1

    我使用配置启动应用程序/会话

    spark.executor.cores=2 spark.executor.memory=10GB

    此时Spark在每个worker节点上启动一个executor的JVM,对吧?

    然后我在第一个会话正在进行配置之前启动另一个 Spark 应用程序/会话

    spark.executor.cores=2 spark.executor.memory=4GB

    此时每个worker节点上都有两个JVM,对吧?

用例 2

我使用配置启动应用程序/会话:

sstsp.spark.shuffle.service.enabled=true
sstsp.spark.dynamicAllocation.enabled=true
sstsp.spark.dynamicAllocation.maxExecutors=35
sstsp.spark.executor.cores=2
sstsp.spark.executor.memory=2GB

这意味着每个工作节点将启动 7 个执行器 (JVM),每个 2 GB RAM,对吧?

附言

JVM 的开销有多大?我的意思是在 用例 2 中,节点的 RAM 被 7 个 JVM 划分,多少 RAM 不会用于计算目的?

【问题讨论】:

【参考方案1】:

正如您提到的,每个工作节点都有 2 个核心,因此通过设置 executor cores=2,每个工作节点将只有 1 个执行程序。

用例 1

1) 5 个工作节点 = 5 个执行器

2) 5 个工作节点 = 5 个执行器(基于可用性)

用例 2

只要您有 executor core=2,最大 executor 将是 5,每个工作节点 1 个 executor。

要在一台机器上启动多个执行程序,您需要启动多个独立工作程序,每个工作程序都有自己的 JVM。由于这些 JVM 进程,它会引入不必要的开销,前提是该 worker 上有足够的内核。

如果您在内存丰富的节点上以独立模式运行 Spark,那么在同一个节点上拥有多个工作器实例会很有好处,因为非常大的堆大小有两个缺点:

垃圾收集器暂停会影响 Spark 作业的吞吐量。 Heap size of >32 GB can’t use CompressedOoops。

Mesos 和 YARN 可以开箱即用地支持将多个较小的执行程序打包到同一物理主机上,因此请求较小的执行程序并不意味着您的应用程序将拥有更少的整体资源。

【讨论】:

感谢您的回答!与用例 1 相关的一个重要说明 - 第二个应用程序与第一个应用程序不并行运行。 5 个工作人员 = 5 个执行程序和两个不同的内存配置情况如何?? 用例 1 总共不会有 10 个执行器。两个应用程序总共最多有 5 个执行器

以上是关于Spark 在具有多个应用程序的工作人员上运行了多少 JVM的主要内容,如果未能解决你的问题,请参考以下文章

Spark 独立模式多个 shell 会话(应用程序)

无法为 Databricks 作业构建具有多个主类的 Spark 应用程序

Spark的基本说明

Spark的Task调度原理

如何在CDH 5上运行Spark应用程序

Spark:从具有不同内存/核心配置的单个JVM作业同时启动