Dataproc 上的 Spark:每个 CPU 可以增加 运行 个执行程序?

Spark on Dataproc: possible to run more executors per CPU?

我在 Google Cloud Dataproc 上 运行ning Spark 1.6.2(因此 Dataproc 版本 1.0)。我的集群由几个 n1-standard-8 工作人员组成,我 运行 每个核心一个执行程序 (spark.executor.cores=1)。

我发现我的总体 CPU 利用率从未超过 50%,即使每个工作人员 运行 拥有正确数量的执行者(我为每个工作人员保留一个核心用于 OS,等等)。

我想知道是否有可能以某种方式 运行 每个 worker 上的更多执行程序以更充分地利用集群?如果是这样,我需要指定哪些设置?

worker 机器上的 lscpu 转储如下所示:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Model name:            Intel(R) Xeon(R) CPU @ 2.50GHz
Stepping:              4
CPU MHz:               2500.000
BogoMIPS:              5000.00
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0-7

感谢任何建议!

默认情况下,YARN 仅根据内存而不是它们请求的核心数来调度容器(在本例中为 spark 执行程序)。 Dataproc 设置执行程序内存,以便每个节点有 2 个执行程序。

spark.executor.cores 在 YARN 的上下文中基本上被忽略了,但它 用来决定有多少任务要 运行 并行。如果您要降低 spark.executor.cores,而不是执行程序内存,那么您实际上是在降低并行度!

您应该单独保留执行程序内存并增加 spark.executor.cores。在 n1-standard-4 上,您应该能够毫无问题地将 spark.executor.cores 从 2 提高到 4。

如果您尝试将 spark.executor.cores 设置为高于节点上 YARN vcore 的数量,Spark 会报错。您可以通过设置 yarn.nodemanager.resource.cpu-vcores=<large-number> 来解决这个问题。然后,<large-number> 将是新的上限。

根据 I/O 工作的限制,您可以轻松地将 spark.executor.cores 增加一倍或四倍,甚至更多。将文件写入 GCS 往往 I/O 受限。

请注意,虽然您可以在 运行 执行 spark 作业时指定 spark 属性,但您只能在创建集群时指定 YARN 属性: