0

近 2 天以来,我一直试图弄清楚如何执行我的 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供参考。

  1. 我使用以下方法编译 .java 文件:

    javac -cp "inputs/lib/hadoop-common.jar:inputs/lib/hadoop-map-reduce-core.jar" -d Demo inputs/DemoJob.java 
    

    (在链接中,它说 -cp 应该是“/usr/lib/hadoop/ :/usr/lib/hadoop/client-0.20/ ”。但我的系统中根本没有这些文件夹)

  2. 使用以下命令创建 jar 文件:

    jar cvf Demo.jar Demo
    
  3. 将2个输入文件移动到HDFS(现在这是我感到困惑的地方。我是否也需要将jar文件移动到HDFS?链接中没有这样说。但如果它不在HDFS中,那么如何hadoop jar .. 命令有效吗?我的意思是它如何结合 Linux 系统中的 jar 文件和 HDFS 中的输入文件?)

  4. 我使用以下方法运行我的代码:

    hadoop jar Demo.jar DemoJob /Inputs/Text1.txt /Inputs/Text2.txt /Outputs
    

我不断得到ClassNotFoundException : DemoJob

有人请帮忙。

4

2 回答 2

0

终于知道问题出在哪里了。我没有从文件夹创建 jar 文件,而是使用 .class 文件直接创建了 jar 文件
jar -cvf Demo.jar *.class

这解决了 ClassNotFound 错误。但我不明白为什么它不早点工作。即使我从文件夹创建了 jar 文件,我在执行类文件时确实提到了文件夹名称:
hadoop jar Demo.jar Demo.DemoJob /Inputs/Text1.txt /Inputs/Text2.txt /Outputs

于 2013-08-07T16:16:50.537 回答
0

class not found 异常仅表示加载 DemoJob 类时未找到某些类。缺少的类可能是 DemoJob 引用(例如导入)的类。我认为问题在于您的类路径中没有 /usr/lib/hadoop/:/usr/lib/hadoop/client-0.20/ 文件夹(类)。这是应该存在但不是可能触发类未找到异常的类。

于 2013-08-07T15:22:20.743 回答