You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EMR集群执行distcp从S3复制到HDFS时失败报错

解决EMR集群执行distcp时mapreduce_shuffle辅助服务不存在的问题

我在AWS EMR Spark集群上执行distcp命令从S3复制文件到HDFS时,也碰到了这个一模一样的错误。先把问题场景和解决方法整理出来:

问题场景

执行这条命令时抛出异常:

hadoop distcp s3a://bucket/file1 /data

错误日志如下:

org.apache.hadoop.yarn.exceptions.InvalidAuxServiceException: The auxService:mapreduce_shuffle does not exist
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateExceptionImpl(SerializedExceptionPBImpl.java:171)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.instantiateException(SerializedExceptionPBImpl.java:182)
at org.apache.hadoop.yarn.api.records.impl.pb.SerializedExceptionPBImpl.deSerialize(SerializedExceptionPBImpl.java:106)
at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$Container.launch(ContainerLauncherImpl.java:162)
at org.apache.hadoop.mapreduce.v2.app.launcher.ContainerLauncherImpl$EventProcessor.run(ContainerLauncherImpl.java:408)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

问题原因

这个错误本质是YARN的配置里没开启mapreduce_shuffle这个辅助服务——distcp底层依赖MapReduce作业,而MapReduce的shuffle阶段必须依赖这个服务来完成数据传输,所以YARN找不到它就会报错。

解决方法

临时修复(仅当前集群会话生效,重启后失效)

如果只是临时解决当前集群的问题,可以按以下步骤操作:

  1. 登录到EMR集群的主节点
  2. 编辑YARN的配置文件/etc/hadoop/conf/yarn-site.xml,添加这两个配置项:
<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
  <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
  1. 重启YARN的相关服务,让配置生效:
sudo stop hadoop-yarn-nodemanager
sudo start hadoop-yarn-nodemanager
sudo stop hadoop-yarn-resourcemanager
sudo start hadoop-yarn-resourcemanager
  1. 重新执行distcp命令,应该就能正常运行了。

永久修复(创建集群时自动配置)

如果不想每次创建EMR集群都手动改配置,可以在创建集群时通过EMR的配置参数预设好:
在集群配置的JSON中加入以下内容:

[
  {
    "Classification": "yarn-site",
    "Properties": {
      "yarn.nodemanager.aux-services": "mapreduce_shuffle",
      "yarn.nodemanager.aux-services.mapreduce_shuffle.class": "org.apache.hadoop.mapred.ShuffleHandler"
    }
  }
]

这样新创建的集群会自动配置好这个辅助服务,无需后续手动修改。

验证配置是否生效

修改完成后,可以用这条命令检查配置是否已经生效:

yarn getconf -confKey yarn.nodemanager.aux-services

如果输出里包含mapreduce_shuffle,说明配置成功了。

内容的提问来源于stack exchange,提问作者Kannaiyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:02:09