我在集群模式下在YARN集群上运行Apache Spark应用程序(spark在此集群上有3个节点).
当应用程序运行时,Spark-UI显示2个执行程序(每个执行程序在不同的节点上运行)和驱动程序在第三个节点上运行.我希望应用程序使用更多的执行程序,所以我尝试将参数--num-executors添加到Spark-submit并将其设置为6.
spark-submit --driver-memory 3G --num-executors 6 --class main.Application --executor-memory 11G --master yarn-cluster myJar.jar <arg1> <arg2> <arg3> ...
但是,执行人数仍然是2.
在spark UI上我可以看到参数spark.executor.instances是6,正如我的意图,并且不知何故仍然只有2个执行器.
我甚至尝试从代码中设置此参数
sparkConf.set("spark.executor.instances", "6")
Run Code Online (Sandbox Code Playgroud)
再次,我可以看到参数设置为6,但仍然只有2个执行程序.
有谁知道为什么我不能增加执行人的数量?
yarn.nodemanager.resource.memory-mb在yarn-site.xml中是12g
我正在尝试使用 EMR 集群上的所有资源。
集群本身是 4 台 m4.4xlarge 机器(1 个驱动程序和 3 个工作程序),具有 16 个 vCore、64 GiB 内存、EBS 存储:128 GiB
通过 cli 启动集群时,我会看到以下选项(所有 3 个选项都在同一数据管道中执行):
只需使用“maximizeResourceAllocation”,无需任何其他 Spark-submit 参数
不要放置任何东西,让 Spark-defaults 完成他们的工作
使用 AWS 指南了解如何在 EMR 中配置集群
按照本指南,我推导出以下spark-submit参数:
"--conf",
"spark.executor.cores=5",
"--conf",
"spark.executor.memory=18g",
"--conf",
"spark.executor.memoryOverhead=3g",
"--conf",
"spark.executor.instances=9",
"--conf",
"spark.driver.cores=5",
"--conf",
"spark.driver.memory=18g",
"--conf",
"spark.default.parallelism=45",
"--conf",
"spark.sql.shuffle.partitions=45",
Run Code Online (Sandbox Code Playgroud)
现在,我确实在互联网上查找了 所有可以查找的地方,但找不到任何关于为什么 EMR 不使用所提供的所有资源的解释。也许我遗漏了一些东西,或者也许这是预期的行为,但是当“maximizeAllocation”仅跨越具有 3 个工作线程的集群上的 2 个执行程序时,就会出现问题。
更新:
因此,今天在运行不同的数据管道时,我使用“maximizeResourceAllocation”得到了这个:
这比其他的要好得多,但在使用的内存和执行器方面仍然缺乏很多(尽管EMR团队的有人说emr将执行器合并为超级执行器以提高性能)。