【问题标题】:Unable to execute Map/Reduce job无法执行 Map/Reduce 作业
【发布时间】:2013-08-07 14:25:10
【问题描述】:

近 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

请有人帮忙。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

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

    【讨论】:

    • 但错误提示找不到 DemoJob 类,这是我的主要 map/reduce 类。而且我假设丢失的文件夹仅适用于代码中使用的 jar 文件。但是我已经从另一个路径链接了所需的 jar 文件。那么这还不够吗?
    • 可能缺少 DemoJob,但您从消息中只知道缺少某些类。如果您使用 JVM 参数 -verbose 运行作业,您将获得大量输出,但其中一些输出会准确告诉您缺少哪个类。
    【解决方案2】:

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

    直接从 .class 文件创建了 jar 文件

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多