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 属性:
我在 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 属性: