根据官方Spark文档(http://spark.apache.org/docs/latest/job-scheduling.html#configuration-and-setup),使用" spark.dynamicAllocation"选项与YARN,您需要:
在每个节点的yarn-site.xml中,将spark_shuffle添加到yarn.nodemanager.aux-services ...
将yarn.nodemanager.aux-services.spark_shuffle.class设置为org.apache.spark.network.yarn.YarnShuffleService
尽管AWS EMR文档说明了
" .. Spark Shuffle Service由EMR自动配置。 (http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-spark-configure.html)
我注意到了," yarn.nodemanager.aux-services"在"纱线网站"在EMR节点上设置为:
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,</value>
</property>
并没有&#34; yarn.nodemanager.aux-services.spark_shuffle.class&#34;完全加入。
我对Spark / Hadoop生态系统有点新意,所以这引起了我的一些问题:
注意:我使用的是emr-ami v.4.6.0
答案 0 :(得分:6)
只需要在运行YARN NodeManager的节点上设置yarn.nodemanager.aux-services属性,该节点在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启用,因此您实际上根本不需要执行/配置任何内容以便在emr-4.4.0 +上使用dynamicAllocation。 (一个例外是如果你启用了maximizeResourceAllocation功能。你仍然可以使用dynamicAllocation和maximizeResourceAllocation,但是你需要在创建集群时在配置中显式启用dynamicAllocation,以防止spark.executor.instances被设置为maximizeResourceAllocation,因为设置执行程序实例的数量会有效地禁用dynamicAllocation。)
顺便说一句,你说MASTER实例确实将yarn.nodemanager.aux-services设置为mapreduce_shuffle是正确的,但这只是如何在EMR上设置此值的配置的工件。虽然看起来这个值似乎在MASTER实例上设置错误(即缺少spark_shuffle值)会让人感到困惑,但它实际上没有效果,因为MASTER实例不运行NodeManager。
另外,由于spark_shuffle不存在,你对Spark回落到mapreduce_shuffle的假设是不正确的。 MapReduce Shuffle服务仅由MapReduce应用程序使用,不能被Spark应用程序使用。