我在AWS上启动了一个Spark集群,其中包含一个主集群和60个核心:
这是启动命令,每个核心基本上有2个执行程序,共有120个执行程序:
spark-submit --deploy-mode cluster --master yarn-cluster --driver-memory 180g --driver-cores 26 --executor-memory 90g --executor-cores 13 --num-executors 120
但是,在求职者中,只有119个执行者:
我以为应该有1名司机120名 Worker 执行人员 . 但是,我看到的是119个遗嘱执行人,其中包括1个司机118个工作执行人 .
这是否意味着我的主节点没有被使用?驱动程序是在主节点还是核心节点上运行?我可以让驱动程序在主节点上运行,让60个核心托管120个工作执行程序吗?
谢谢!
3 回答
在 yarn-client 模式下,Spark驱动程序在启动Spark应用程序的客户端进程内运行 .
有关详细信息,请查看cloudera博客 .
当您运行纱线群集模式时,应用程序的驱动程序在群集中运行,而不是在您运行spark提交的计算机上运行 . 这意味着它将占用集群上的驱动程序核心数,从而产生您看到的119个执行程序 .
如果要在群集外运行驱动程序,请尝试使用yarn-client模式 .
有关在YARN上运行的更多详细信息,请访问:http://spark.apache.org/docs/latest/running-on-yarn.html
通过使用
cluster-mode
,资源分配具有下图所示的结构 .我将尝试提供YARN对资源分配计算的说明 . 首先,每个核心节点的规格如下(您可以确认here):
内存:244 GB
核心/ vCPU:32
这意味着您可以最多运行:
2 executors per core node ,根据请求的内存和内核计算得出 . 具体来说,
available_cores / requested_cores = 32 / 13 = 2.46 -> 2
&available_mem / requested_mem = 244 / 90 = 2.71 = 2
.a single driver, without any more executors in a single core node . 这是因为当驱动程序在核心节点中运行时,它会留下244-180 = 64 GB的内存,32和32-26 = 6个核心/ vCPUS,这些不足以运行单独的执行程序 .
因此,从现有的60个核心节点池中,1个节点用于驱动程序,剩下59个核心节点,运行59 * 2 = 118个执行程序 .
如果您的意思是是否使用主节点来执行驱动程序,那么答案是 no . 但是,请注意,master可能同时运行了许多其他应用程序,这些应用程序在本讨论的上下文中是超出范围的(例如,YARN资源管理器,HDFS名称节点等) .
后者, the driver is running on the core node (因为您使用了
--deploy-mode cluster
参数) .是!这样做的方法是 execute the same command but with --deploy-mode client (或者保留该参数未指定,因为在撰写本文时,它被Spark用作默认值) in the master node .
通过这样做,资源分配将具有下图所示的结构 .
请注意,Application Master仍然会从群集中消耗一些资源(“从执行程序中窃取一些资源) . 但是,默认情况下,AM资源是最小的,可以看作here(
spark.yarn.am.memory
和spark.yarn.am.cores
选项),所以它不应该有影响很大 .