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 生态系统有点陌生,所以这在我脑海中提出了几个问题:
- 为什么我仍然能够成功 运行 将 "spark.dynamicAllocation" 设置为 "true" 的 Spark 作业,但不满足基本配置要求?这是否意味着 Spark 可以以某种方式使用 "mapreduce_shuffle" 作为后备?
- 如果上述假设(Spark 回退到 "mapreduce_shuffle")为真,使用不当随机播放是否可能对性能(其他?)产生影响 class("mapreduce_shuffle" 映射到 "org.apache.hadoop.mapred.ShuffleHandler" class)?
注意:我使用的是 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应用无法使用。
根据 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 生态系统有点陌生,所以这在我脑海中提出了几个问题:
- 为什么我仍然能够成功 运行 将 "spark.dynamicAllocation" 设置为 "true" 的 Spark 作业,但不满足基本配置要求?这是否意味着 Spark 可以以某种方式使用 "mapreduce_shuffle" 作为后备?
- 如果上述假设(Spark 回退到 "mapreduce_shuffle")为真,使用不当随机播放是否可能对性能(其他?)产生影响 class("mapreduce_shuffle" 映射到 "org.apache.hadoop.mapred.ShuffleHandler" class)?
注意:我使用的是 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应用无法使用。