我在Google Cloud Dataproc上运行Spark 1.6.2(所以Dataproc版本1.0)。我的集群由一些n1-standard-8
工作者组成,我每个核心运行一个执行程序(spark.executor.cores=1
)。
我看到我的整体CPU利用率从未达到50%以上,即使每个工作者都运行了正确数量的执行程序(我在每个工作人员中留下一个核心用于操作系统等)。
我想知道是否有可能以某种方式在每个工作者上运行更多的执行程序来更充分地利用集群?如果是这样,我需要指定哪些设置?
工作机器上的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 vcores的数量,Spark会抱怨。您可以通过设置yarn.nodemanager.resource.cpu-vcores=<large-number>
来解决此问题。然后,<large-number>
将成为新的上限。
根据您的工作对I / O的限制,如果不是更多,您可以轻松地将spark.executor.cores
翻倍或翻两倍。将文件写入GCS往往会受到I / O限制。
请注意,虽然您可以在运行spark作业时指定spark属性,但您只能在创建集群时指定YARN属性: