我在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个执行程序。但是,我看到的是119个遗嘱执行人,其中包括1名司机+ 118名工作执行人员。
这是否意味着我的主节点未被使用?驱动程序是在主节点还是核心节点上运行?我可以让驱动程序在主节点上运行,并让60个核心托管120个工作执行程序吗?
谢谢!
答案 0 :(得分:5)
在 yarn-cluster 模式下,驱动程序在Application Master中运行。这意味着同一进程负责驱动应用程序和从YARN请求资源,并且此进程在YARN容器内运行。启动应用程序的客户端无需在整个生命周期内坚持使用。
在 yarn-client 模式下,Spark驱动程序在启动Spark应用程序的客户端进程内运行。
有关详细信息,请查看cloudera博客。
答案 1 :(得分:2)
当您运行yarn-cluster模式时,应用程序的驱动程序在群集中运行,而不是在您运行spark提交的计算机上运行。这意味着它将占用集群上的驱动程序核心数,从而导致您看到的119个执行程序。
如果要在群集外部运行驱动程序,请尝试使用yarn-client模式。
有关在YARN上运行的更多详细信息,请访问:http://spark.apache.org/docs/latest/running-on-yarn.html
答案 2 :(得分:2)
通过使用cluster-mode
,资源分配具有下图所示的结构。
我将尝试提供YARN所做资源分配计算的说明。首先,每个核心节点的规格如下(您可以确认here):
这意味着您可以最多运行:
available_cores / requested_cores = 32 / 13 = 2.46 -> 2
& available_mem / requested_mem = 244 / 90 = 2.71 = 2
。因此,从现有的60个核心节点池中,1个节点用于驱动程序,剩下59个核心节点,运行59 * 2 = 118个执行程序。
这是否意味着我的主节点未被使用?
如果您的意思是是否使用主节点来执行驱动程序,那么答案是否。但是,请注意,master可能同时运行了许多其他应用程序,这些应用程序在本讨论的上下文中是超出范围的(例如YARN资源管理器,HDFS名称节点等)。
驱动程序是在主节点还是核心节点上运行?
后者,驱动程序正在核心节点上运行(因为您使用了--deploy-mode cluster
参数)。
我可以让驱动程序在主节点上运行,并让60个核心托管120个工作执行程序吗?
是的!这样做的方法是执行相同的命令,但使用--deploy-mode client
(或保留该参数未指定,因为在撰写本文时,它被Spark用作默认值) in主节点。
通过这样做,资源分配将具有下图所示的结构。
请注意,Application Master仍然会从群集中消耗一些资源(“从执行程序中窃取一些资源)。但是,默认情况下,AM资源是最小的,可以看作here({{1} }和spark.yarn.am.memory
选项),所以它不应该产生很大的影响。