我在4节点集群上运行Spark over Yarn . 节点中每台机器的配置为128GB内存,每节点24核CPU . 我使用这个命令运行Spark
spark-shell --master yarn --num-executors 19 --executor-memory 18g --executor-cores 4 --driver-memory 4g
但Spark最多只能启动16个执行程序 . 我将纱线的最大值分配设置为80(我拥有的94个核心) . 所以我的印象是,这将启动19个执行者,但它最多只能有16个遗嘱执行人 . 此外,我不认为即使这些执行程序完全使用分配的VCores .
这些是我的问题
-
为什么没有't spark creating 19 executors. Is there a computation behind the scenes that'限制它?
-
如果我想获得最佳的火花性能,在我的群集配置下运行spark-shell的最佳配置是什么
-
driver-core默认设置为1 . 增加它会提高性能 .
这是我的纱线配置
-
yarn.nodemanager.resource.memory-mb:106496
-
yarn..minimum-allocation-mb:3584
-
yarn..maximum-allocation-mb:106496
-
yarn..minimum-allocation-vcores:1
-
yarn..maximum-allocation-vcores:20
-
yarn.nodemanager.resource.cpu-vcores:20
2 回答
我仍然无法评论,所以它将作为一个答案 .
见this问题 . 请你减少执行程序内存并尝试再次运行吗?
好吧,按照我们的配置,我们有:(我也是Spark的新手但下面是我在这个场景中推测的)每个节点有24个内核和128GB内存,我们在集群中有4个节点 .
我们为开销分配1个核心和1 GB内存,并考虑您在YARN-Client模式下运行集群 .
我们有4个节点的127GB Ram和23个核心 .
如_291021中所述,当每个执行程序最多分配5个核心时,YARN以最佳性能运行 .
所以,23X4 = 92个核心 . 如果我们为每个 Actuator 分配5个核心,则18个 Actuator 具有5个核心,1个 Actuator 具有2个核心或类似 . 因此,假设我们的应用程序中有18个执行程序,每个执行程序有5个核心 . Spark在4个节点上分配这18个 Actuator . 假设它的分布式为:第一个节点:4个 Actuator 第二个节点:4个 Actuator 第3个节点:5个 Actuator 第4个节点:5个 Actuator
现在,由于'yarn.nodemanager.resource.memory-mb:106496'在您的配置中设置为104GB,每个节点可以分配最多104 GB内存(我建议增加此参数) . 对于具有4个执行程序的节点:每个执行程序104/4 - 26GB对于具有5个执行程序的节点:每个执行程序104/5~21GB . 现在剩下7%的内存用于开销,我们得到24GB和20GB .
所以我建议使用以下配置: - --num-executors:18 --executor-memory:20G --executor-cores:5
此外,这是考虑您在客户端模式下运行群集,但如果您在Yarn-cluster模式下运行群集1节点将被分配fir驱动程序,并且计算将需要以不同方式完成 .