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

时间:2016-07-05 20:10:46

标签: hadoop apache-spark emr amazon-emr

根据官方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生态系统有点新意,所以这引起了我的一些问题:

  • 为什么我仍然可以使用&#34; spark.dynamicAllocation&#34;成功运行Spark作业设置为&#34; true&#34;,但未满足基本配置要求?这是否意味着Spark某种程度上可以使用&#34; mapreduce_shuffle&#34;作为后备?
  • 如果上面的假设(Spark回到&#34; mapreduce_shuffle&#34;)是真的,那么使用不正确的shuffle类是否有可能表现(其他?)的影响(&#34; mapreduce_shuffle&#34; map to& #34; org.apache.hadoop.mapred.ShuffleHandler&#34; class)?

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

1 个答案:

答案 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应用程序使用。