Hadoop:奇怪的ClassNotFoundException

时间:2012-06-11 08:44:53

标签: java class hadoop mapreduce hadoop-streaming

我收到了一个classnotfound异常。声称未找到的类不存在,但类名称被设置为我的map reduce作业的输入文件列表的路径。

INFO  server Running: /usr/lib/hadoop/bin/hadoop --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf jar tmp.jar /user/hduser/datasets/ /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20

Exception in thread "main" java.lang.ClassNotFoundException: /user/hduser/datasets/

at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(Runjar.java:190)

正如我们所看到的,/user/hduser/datasets/是输入文件的路径。为什么我将此错误视为ClassNotFoundException?为什么它把它视为一个类?


我发现了自己的错误。我有一个包结构。我需要指定我的包信息

/usr/lib/hadoop/bin/hadoop 
    --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf 
    jar tmp.jar org.myorg.tmp /user/hduser/datasets/ 
    /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20

在我的工具中,没有选项可以将包作为Java的参数。所以我需要没有包装。但是,由于缺少此输入文件路径之前的参数,因此出现以下错误。

我的类直接位于其根目录中的tmp.jar中。我的意思是没有org.myorg等......

解决方案:

jar cmf [manifest_file] [jar_name.jar] -C [folder_of_classes] [path_for_jar_file]

它会将manifest_file的内容与jar存档中生成的清单文件合并。在manifest_file中包含以下行 Main-Class:[Name_Of_Class]

1 个答案:

答案 0 :(得分:2)

是否有包层次结构(如果没有,你做错了)你仍然需要给它包含main的类的名称。

例如,the docs有一个主要类为org.myorg.WordCount的示例。即使WordCount在默认包中,如果jar文件在清单中没有包含主类,也应该指定它:

bin/hadoop jar /usr/joe/wordcount.jar WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output

我假设您也可以在清单中指定主类,就像任何jar一样; class参数在那些相同的文档中显示为可选。