我在 EMR(版本 5.32.0)上的 (Py)Spark 中遇到了一些问题。大约一年前,我在 EMR 集群上运行了相同的程序(我认为版本一定是 5.29.0)。然后我可以使用配置我的 PySpark 程序spark-submit
正确地论证。但是,现在我正在运行相同/相似的代码,但是spark-submit
争论似乎没有任何作用。
我的集群配置:
- 主节点:8 个 vCore、32 GiB 内存、仅 EBS 存储 EBS 存储:128 GiB
- 从节点:10 x 16 vCore、64 GiB 内存、仅 EBS 存储 EBS 存储:256 GiB
我用以下命令运行程序spark-submit
论点:
spark-submit --master yarn --conf "spark.executor.cores=3" --conf "spark.executor.instances=40" --conf "spark.executor.memory=8g" --conf "spark.driver.memory=8g" --conf "spark.driver.maxResultSize=8g" --conf "spark.dynamicAllocation.enabled=false" --conf "spark.default.parallelism=480" update_from_text_context.py
我没有更改集群上的默认配置中的任何内容。
下面是 Spark UI 的屏幕截图,显示只有 10 个执行程序,而我预计有 40 个可用执行程序......
我尝试了不同的spark-submit
参数以确保错误与无关Apache Spark:设置执行程序实例不会更改执行程序 https://stackoverflow.com/questions/29940711/apache-spark-setting-executor-instances-does-not-change-the-executors。我尝试了很多方法,但似乎没有任何帮助。
我在这里有点迷失,有人可以帮忙吗?
UPDATE:我在 EMR 版本标签 5.29.0 上运行了相同的代码,并且在spark-submit
论证似乎有效:
为什么会发生这种情况?
很抱歉造成混乱,但这是故意的。在 emr-5.32.0 上,Spark+YARN 会将到达同一节点的多个执行程序请求合并到一个更大的执行程序容器中。请注意,尽管您的执行程序比您预期的要少,但每个执行程序都具有您指定的更多内存和内核。 (不过,这里有一个星号,我将在下面解释。)
此功能旨在在大多数情况下默认提供更好的性能。如果您确实希望保留以前的行为,您可以通过设置spark.yarn.heterogeneousExecutors.enabled=false来禁用这个新功能,尽管我们(我在EMR团队)希望听到您关于为什么以前的行为是优选的。
不过,对我来说没有意义的一件事是,您最终应该得到与没有此功能时相同的执行器核心总数,但对于您共享的示例来说,这种情况似乎没有发生。您要求 40 个执行程序,每个执行程序有 3 个核心,但后来得到了 10 个执行程序,每个执行程序有 15 个核心,总共有点多。这可能与您请求的 8g 的 Spark.executor.memory 划分为您所选实例类型上可用内存的方式有关,我猜测可能是 m5.4xlarge。可能对您有帮助的一件事是删除spark.executor.memory/cores/instances 的所有覆盖并仅使用默认值。我们希望默认值在大多数情况下都能提供最佳性能。如果没有,就像我上面说的,请告诉我们,以便我们进一步改进!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)