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找不到它就会报错。
解决方法
临时修复(仅当前集群会话生效,重启后失效)
如果只是临时解决当前集群的问题,可以按以下步骤操作:
- 登录到EMR集群的主节点
- 编辑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>
- 重启YARN的相关服务,让配置生效:
sudo stop hadoop-yarn-nodemanager sudo start hadoop-yarn-nodemanager sudo stop hadoop-yarn-resourcemanager sudo start hadoop-yarn-resourcemanager
- 重新执行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
相关产品推荐
相关产品推荐

