我正在使用 Spark + Standalone 集群管理器。我有 5 个工作节点,每个工作节点有 2 个核心和 14 GB RAM。
如何计算 Spark 将在工作节点上启动多少 JVM?
用例 1
我使用配置启动应用程序/ session
spark.executor.cores=2 Spark.executor.memory=10GB
此时 Spark 在每个工作节点上启动一个执行器的 JVM,对吧?
然后,在第一个 session 进行配置之前启动另一个 Spark 应用程序/ session
spark.executor.cores=2 Spark.executor.memory=4GB
此时每个工作节点上有两个 JVM,对吧?
用例 2
我使用配置启动应用程序/ session :
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 不会用于计算目的?
最佳答案
正如您提到的,每个工作节点都有 2 个核心,因此这意味着通过设置 executor cores=2,每个工作节点将只有 1 个执行程序。
用例 1
1) 5 个工作节点 = 5 个执行器
2) 5 个工作节点 = 5 个执行程序(基于可用性)
用例 2
只要您有执行程序 core=2,最大执行程序将为 5 个,每个工作节点有 1 个执行程序。
要在一台机器上启动多个执行程序,您需要启动多个独立的工作线程,每个工作线程都有自己的 JVM。如果该工作线程上有足够的内核,它会由于这些 JVM 进程而引入不必要的开销。
如果您在内存丰富的节点上以独立模式运行 Spark,则在同一节点上拥有多个工作实例可能会很有好处,因为非常大的堆大小有两个缺点:
- 垃圾收集器暂停可能会损害 Spark 作业的吞吐量。
- Heap size of >32 GB can’t use CompressedOoops .
Mesos 和 YARN 可以开箱即用地支持将多个较小的执行器打包到同一物理主机上,因此请求较小的执行器并不意味着您的应用程序将拥有更少的总体资源。
关于java - Spark 在具有多个应用程序的工作线程上运行了多少个 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44021624/