执行WordCount命令时出现NoClassDefFoundError错误求助
执行Hadoop WordCount任务时遇到的类缺失错误排查与解决
问题概述
执行WordCount任务时Job直接失败,核心报错为java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/util/Clock,导致MRAppMaster无法初始化,最终任务终止。
完整报错信息
2023-10-06 15:55:35,005 INFO mapreduce.Job: Job job_1696606856991_0001 running in uber mode: false 2023-10-06 15:55:35,006 INFO mapreduce.Job: map 0% reduce 0% 2023-10-06 15:55:35,027 INFO mapreduce.Job: Job job_1696606856991_0001 failed with state FAILED due to: Application application_1696606856991_0001 failed 2 times due to AM Container for appattempt_169 6606856991_0001_000002 exited with exitCode: 1 Failing this attempt.Diagnostics: [2023-10-06 15:55:34.304] Exception from container-launch. Container id: container_1696606856991_0001_02_000001 Exit code: 1 [2023-10-06 15:55:34.311] Container exited with a non-zero exit code 1. Error file: prelaunch.err. Last 4096 bytes of prelaunch.err : Last 4096 bytes of stderr : Error: Unable to initialize main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Caused by: java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/util/Clock [2023-10-06 15:55:34.311] Container exited with a non-zero exit code 1. Error file: prelaunch.err. Last 4096 bytes of prelaunch.err : Last 4096 bytes of stderr : Error: Unable to initialize main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Caused by: java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/util/Clock For more detailed output, check the application tracking page: http://baoanh-master: 9004/cluster/app /application_1696606856991_0001 Then click on links to logs of each attempt. . Failing the application. 2023-10-06 15:55:35,052 INFO mapreduce.Job: Counters: 0 input file1.txt: Hello World input file2.txt: Hello Hadoop wordcount output: cat: output1/part-r-00000': No such file or directory
相关配置与脚本
yarn-site.xml
<configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARNHOME,HADOOP_MAPRED_HOME</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>baoanh-master:9002</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>baoanh-master:9003</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>baoanh-master:9004</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>baoanh-master:9005</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>baoanh-master:9006</value> </property> </configuration>
mapred-site.xml
<configuration> <property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value> </property> <property> <name>mapreduce.jobtracker.address</name> <value>baoanh-master:9001</value> </property> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=/home/hadoopbaoanh/hadoop</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=/home/hadoopbaoanh/hadoop</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=/home/hadoopbaoanh/hadoop</value> </property> </configuration>
test.sh
#!/bin/bash # test the hadoop cluster by running wordcount # create input files mkdir input echo "Hello World" > input/file1.txt echo "Hello Hadoop" > input/file2.txt # create input directory on HDFS hadoop fs -mkdir -p input1 # put input files to HDFS hdfs dfs -put ./input/* input1 # run wordcount hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-3.3.6-sources.jar org.apache.hadoop.examples.WordCount input1 output1 # print the input files echo -e " input file1.txt:" hdfs dfs -cat input1/file1.txt echo -e " input file2.txt:" hdfs dfs -cat input1/file2.txt # print the output of wordcount echo -e " wordcount output:" hdfs dfs -cat output1/part-r-00000
问题排查与解决步骤
1. 完善MapReduce应用类路径配置
报错中org/apache/hadoop/yarn/util/Clock属于YARN组件依赖类,当前mapreduce.application.classpath仅包含MapReduce相关jar包,缺少YARN依赖。修改mapred-site.xml中的该配置项:
<property> <name>mapreduce.application.classpath</name> <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*:$HADOOP_YARN_HOME/share/hadoop/yarn/*:$HADOOP_YARN_HOME/share/hadoop/yarn/lib/*:$HADOOP_COMMON_HOME/share/hadoop/common/*:$HADOOP_COMMON_HOME/share/hadoop/common/lib/*</value> </property>
2. 修正环境变量拼写错误
yarn-site.xml中yarn.nodemanager.env-whitelist里的HADOOP_YARNHOME拼写错误,应为HADOOP_YARN_HOME,修正后:
<property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property>
3. 使用正确的WordCount执行jar包
当前脚本使用的是源码jar包(hadoop-mapreduce-examples-3.3.6-sources.jar),需替换为编译好的可执行jar包,修改test.sh中的执行命令:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar org.apache.hadoop.examples.WordCount input1 output1
4. 重启Hadoop服务
修改配置后,重启YARN和HDFS服务确保配置生效:
stop-yarn.sh stop-dfs.sh start-dfs.sh start-yarn.sh
5. 清理旧数据重新执行
清理HDFS上的旧输出目录避免冲突:
hdfs dfs -rm -r output1
之后重新运行test.sh脚本即可。
内容的提问来源于stack exchange,提问作者Vũ Phan Bảo Anh
相关产品推荐
相关产品推荐

