使用 Google Cloud Dataproc 在 YARN 上启动意外数量的执行者
Spark on YARN unexpected number of executors with Google Cloud Dataproc
我正在尝试在集群上提交一个 spark 应用程序,在 GCP Dataproc 上具有以下规范:
- 3 个工作节点,每个节点具有 15GB RAM 和 4 个内核
- 1 个主节点 7.5GB RAM 和 2 个内核
根据我在 YARN 上找到的有关内存和执行程序调优的指南,我得出了以下应用程序参数值:
spark = SparkSession.builder \
.appName("test") \
.master("yarn")\
.config('spark.submit.deployMode','client')\
.config("spark.executor.instances", "3")\
.config("spark.executor.memory","10g")\
.config("spark.executor.cores","3")\
.enableHiveSupport() \
.getOrCreate()
就 spark.executor.memory
而言,我应该完全符合限制,因为我为 OS 和 Hadoop 守护进程保留了 1gb RAM,因此考虑到内存开销,我的限制应该是
max(384MB, .07 * spark.executor.memory)---> max(384MB, .07*14GB)=max(384mb,0,98GB)= approx 1GB
所以 15-2GB=13GB,为了安全起见,我指定了 10GB。
可用内核为 4-1=3,因为正如我刚才所说,保留了 1 个内核。
我希望在应用程序中看到 UI 3 个执行程序,但我只得到 2 个,我也尝试通过指定 spark.executor.cores=2
而不是 2 无济于事。
我是不是漏掉了什么?
谢谢
Dataproc默认启用Spark动态分配,所以需要设置spark.dynamicAllocation.enabled=false
使用静态分配。
另请注意,YARN NodeManager 不会获取所有工作节点内存,其中一部分 (~20%) 是为包括 NodeManager 本身在内的服务保留的。检查 YARN UI 或实际内存的配置。
我正在尝试在集群上提交一个 spark 应用程序,在 GCP Dataproc 上具有以下规范:
- 3 个工作节点,每个节点具有 15GB RAM 和 4 个内核
- 1 个主节点 7.5GB RAM 和 2 个内核
根据我在 YARN 上找到的有关内存和执行程序调优的指南,我得出了以下应用程序参数值:
spark = SparkSession.builder \
.appName("test") \
.master("yarn")\
.config('spark.submit.deployMode','client')\
.config("spark.executor.instances", "3")\
.config("spark.executor.memory","10g")\
.config("spark.executor.cores","3")\
.enableHiveSupport() \
.getOrCreate()
就 spark.executor.memory
而言,我应该完全符合限制,因为我为 OS 和 Hadoop 守护进程保留了 1gb RAM,因此考虑到内存开销,我的限制应该是
max(384MB, .07 * spark.executor.memory)---> max(384MB, .07*14GB)=max(384mb,0,98GB)= approx 1GB
所以 15-2GB=13GB,为了安全起见,我指定了 10GB。
可用内核为 4-1=3,因为正如我刚才所说,保留了 1 个内核。
我希望在应用程序中看到 UI 3 个执行程序,但我只得到 2 个,我也尝试通过指定 spark.executor.cores=2
而不是 2 无济于事。
我是不是漏掉了什么?
谢谢
Dataproc默认启用Spark动态分配,所以需要设置spark.dynamicAllocation.enabled=false
使用静态分配。
另请注意,YARN NodeManager 不会获取所有工作节点内存,其中一部分 (~20%) 是为包括 NodeManager 本身在内的服务保留的。检查 YARN UI 或实际内存的配置。