spark.dynamicAllocation 的 EMR 配置与 Spark 官方文档不匹配

EMR configuration for spark.dynamicAllocation doesn't match Spark official documentation

根据 Spark 官方文档 (http://spark.apache.org/docs/latest/job-scheduling.html#configuration-and-setup),在 YARN 中使用 "spark.dynamicAllocation" 选项时,您需要:

In the yarn-site.xml on each node, add spark_shuffle to yarn.nodemanager.aux-services ...

set yarn.nodemanager.aux-services.spark_shuffle.class to org.apache.spark.network.yarn.YarnShuffleService

尽管 AWS EMR 文档说,

"..Spark Shuffle Service is automatically configured by EMR. (http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-spark-configure.html)

我注意到,EMR 节点上 "yarn-site" 中的 "yarn.nodemanager.aux-services" 设置为:

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle,</value>
</property>

并且根本没有添加 "yarn.nodemanager.aux-services.spark_shuffle.class" 的部分。

我对 Spark/Hadoop 生态系统有点陌生,所以这在我脑海中提出了几个问题:

注意:我使用的是 emr-ami v. 4.6.0

yarn.nodemanager.aux-服务 属性 只需要在 运行 YARN NodeManager 节点上设置,在 EMR 上只有 CORE/TASK 个实例,而不是MASTER 实例(除非它是单节点集群)。

在 EMR 上,yarn.nodemanager.aux-services 和 yarn.nodemanager.aux-services.spark_shuffle.class 属性确实在 CORE/TASK 实例上正确设置,但不是在 MASTER 实例上,所以 AWS EMR 文档是正确的,因为启用 dynamicAllocation 所需要做的就是设置 spark.dynamicAllocation.enabled=true(在创建集群时或通过 spark-submit 选项为单个应用程序设置)。

事实上,从 emr-4.4.0 开始,dynamicAllocation 已默认启用,因此您实际上根本不需要 do/configure 任何东西即可在 emr-4.4.0+ 上使用 dynamicAllocation . (一个例外是如果您启用了 maximizeResourceAllocation 功能。您仍然可以将 dynamicAllocation 与 maximizeResourceAllocation 一起使用,但是您需要在创建集群时在配置中显式启用 dynamicAllocation 以防止 spark.executor.instances 被设置maximizeResourceAllocation,因为设置执行器实例的数量会有效地禁用 dynamicAllocation。)

顺便说一句,您说 MASTER 实例确实将 yarn.nodemanager.aux-services 仅设置为 mapreduce_shuffle 是正确的,但这只是该值的配置方式的产物设置在电子病历上。虽然在 MASTER 实例上看到这个值似乎设置不正确(即缺少 spark_shuffle 值)可能会让人感到困惑,但它实际上没有任何效果,因为 MASTER 实例没有 运行 NodeManager。

此外,由于 spark_shuffle 不存在,您关于 Spark 回退到 mapreduce_shuffle 的假设是不正确的。 MapReduce Shuffle Service仅供MapReduce应用使用,Spark应用无法使用。