hadoop3.0 java.lang.ClassNotFoundException

来源:互联网 发布:小苍淘宝店外设 编辑:程序博客网 时间:2024/05/09 19:59

最近兴趣来了,转身就入了hadoop的坑,差点疯掉,对于做了这么多年程序的我来说,学习起来不算难。但是,这玩意最新版中文文献都很少,版本间改动还不少,官方说明又不全面,于是就坑了一大堆人。今天先来说说 java.lang.ClassNotFoundException


1.mapred-site.xml 这个文件是需要加入这个节点 mapreduce.application.classpath ,该参数用来指定执行mapreduce时搜索的class路径,相信这个在其他人的集群搭建中也有说明。如果你运行自带的 wordcount ,出现java.lang.ClassNotFoundException ,那么大概就是这个节点没有配置

$HADOOP_HOME/etc/hadoop,
$HADOOP_HOME/share/hadoop/common/*,
$HADOOP_HOME/share/hadoop/common/lib/*,
$HADOOP_HOME/share/hadoop/hdfs/*,
$HADOOP_HOME/share/hadoop/hdfs/lib/*,
$HADOOP_HOME/share/hadoop/mapreduce/*,
$HADOOP_HOME/share/hadoop/mapreduce/lib/*,
$HADOOP_HOME/share/hadoop/yarn/*,
$HADOOP_HOME/share/hadoop/yarn/lib/*


2.在伪分布式中,根据教程在windows下用ecllipse创建了自己的wordcount.jar,并且用setJarByClass,setMapperClass,setReducerClass指定相应的class,然后发现比如说放在/home/wordcount.jar 去执行hadoop jar /home/wordcount.jar xxx.xxx.xxx.xxx  ,居然出现

2016-11-11 23:50:13,258 INFO mapreduce.Job: Task Id : attempt_1478936149617_0003_m_000000_1, Status : FAILED
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class aether.hadoop.mr.WordCount$WordMapper not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2277)
        at org.apache.hadoop.mapreduce.task.JobContextImpl.getMapperClass(JobContextImpl.java:187)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:747)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:175)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1790)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:169)
Caused by: java.lang.ClassNotFoundException: Class aether.hadoop.mr.WordCount$WordMapper not found
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2181)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2275)
        ... 8 more

这就纳闷了,难道打包的问题?各种打包后依然不行。我当时已经确信WordMapper 这类肯定在这个包里面的,而且当时很奇怪,自带的wordcount是能执行的。机智的我,把自己写的wordcount放在自带的wordcount的路径下,果然。成功执行。那么我确定了,就是mapreduce.application.classpath没有搜索我放在home下的wordcount.jar中的class。于是,在java中,加入configuration.set("mapreduce.application.classpath", System.getProperty("user.dir")); 即可在任意目录下运行


3.今天我换在了真正的分布式集群中,居然又出现java.lang.ClassNotFoundException,差点没被气吐血。这玩意就差点坑死我。终于在csdn上有人提及mapred.jar,http://blog.csdn.net/shiqidide/article/details/8166960。在java中加上configuration.set("mapred.jar", System.getProperty("user.dir")+"/WordCount.jar");  终于能正常运行了。。。

1 0
原创粉丝点击