我已经试着弄清楚如何执行我的Map/Reduce作业将近两天了。我一直收到ClassNotFound异常。
我使用Cloudera CDH4.3.0在Ubuntu中安装了一个Hadoop集群。java文件(DemoJob.java不在任何包中)位于名为inputs的文件夹中,所有必需的jar文件都位于inputs/lib中。
我紧随其后http://www.cloudera.com/content/cloudera-content/cloudera-docs/HadoopTutorial/CDH4/Hadoop-Tutorial/ht_topic_5_2.html以供参考。
-
我使用编译.java文件
javac -cp "inputs/lib/hadoop-common.jar:inputs/lib/hadoop-map-reduce-core.jar" -d Demo inputs/DemoJob.java
(在链接中,它说-cp应该是"/usr/lib/hadop/:/usr/lib/haop/client-0.20/"。但我的系统中根本没有这些文件夹)
-
创建jar文件使用:
jar cvf Demo.jar Demo
-
将2个输入文件移动到HDFS(现在我很困惑。我也需要把jar文件移到HDFS吗?链接中没有这么说。但如果它不在HDFS中,那么hadoop-jar..命令是如何工作的?我的意思是,它如何将Linux系统中的jar文件和HDFS中的输入文件结合起来?)
-
我运行我的代码使用:
hadoop jar Demo.jar DemoJob /Inputs/Text1.txt /Inputs/Text2.txt /Outputs
我一直得到ClassNotFoundException : DemoJob
。
有人请帮忙。
类未找到异常仅表示在加载类DemoJob时未找到某些类。丢失的类可能是DemoJob引用(例如导入)的类。我认为问题在于您的类路径中没有/usr/lib/hadoop/:/usr/lib/hhadoop/client-0.20/文件夹(类)。应该存在但不存在的类可能触发了未找到类的异常。
终于发现了问题所在。我没有从文件夹中创建jar文件,而是使用jar -cvf Demo.jar *.class
从.class文件中直接创建了jar文件
这解决了ClassNotFound错误。但我不明白为什么它早些时候不起作用。即使在从文件夹创建jar文件时,我在执行类文件时也提到了文件夹名称:hadoop jar Demo.jar Demo.DemoJob /Inputs/Text1.txt /Inputs/Text2.txt /Outputs