Yarn启动NodeManager报ClassNotFoundException: org.apache.hadoop.mapred.ShuffleHandler如何解决?
解决NodeManager启动时的
ClassNotFoundException: org.apache.hadoop.mapred.ShuffleHandler异常 最近我碰到了一个挺头疼的问题——手动执行yarn nodemanager启动NodeManager时直接失败,翻日志一看,核心异常就是ClassNotFoundException: org.apache.hadoop.mapred.ShuffleHandler。而且搜了一圈发现不少人都遇到这个问题,但网上靠谱的解决办法不多,所以特意把问题和我验证有效的解决方案整理出来:
问题重现
执行启动命令:
yarn nodemanager
NodeManager无法正常启动,日志中明确抛出:
ClassNotFoundException: org.apache.hadoop.mapred.ShuffleHandler
问题根源
这个异常其实是因为NodeManager的classpath里缺少了ShuffleHandler类所在的依赖包。ShuffleHandler是MapReduce shuffle阶段的关键组件,它的类文件在hadoop-mapreduce-client-shuffle-*.jar包里,如果这个jar包没被加载到NodeManager的类路径中,就会触发这个找不到类的错误。
有效解决方案
我试了两种方法都能解决问题,大家可以根据自己的情况选:
方法一:修改yarn-env.sh配置,手动添加依赖到classpath
- 找到Hadoop配置目录下的
yarn-env.sh(一般在$HADOOP_HOME/etc/hadoop下面) - 打开文件后,添加以下配置,把MapReduce相关的依赖包都加入到NodeManager的类路径中:
export YARN_NODEMANAGER_OPTS="-Djava.class.path=$HADOOP_HOME/share/hadoop/mapreduce/*:$HADOOP_HOME/share/hadoop/mapreduce/lib/*:$YARN_NODEMANAGER_OPTS" - 保存文件后,重新执行启动命令:
yarn nodemanager
方法二:检查并补充缺失的MapReduce依赖包
- 先去
$HADOOP_HOME/share/hadoop/mapreduce/目录下,看看有没有hadoop-mapreduce-client-shuffle-*.jar这个文件 - 如果找不到这个jar包,要么重新下载完整的Hadoop安装包替换现有部署,要么单独获取对应版本的该jar包放到上述目录中
- 补全之后再启动NodeManager就正常了
内容的提问来源于stack exchange,提问作者N.J.
相关产品推荐
相关产品推荐

