编译Hadoop示例程序时找不到主类

时间:2014-11-07 04:02:16

标签: java hadoop digital-ocean word-count

您好我是Hadoop的新手,几天前就开始学习了。我只是按照Digital Ocean的说明进行了setup a Hadoop cluster。之后我尝试了Hadoop docs中一个名为WordCount的简单示例程序。

我的hadoop版本是2.5.1,它与本教程中使用的版本相同,并且它在Ubuntu Precise上运行。我确保我已按照教程说的那样完成了正确的设置。这是〜/ .bashrc 内容的结尾。

        ...
#HADOOP VARIABLES START
export JAVA_HOME=/usr/lib/jvm/java-7-oracle
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
export HADOOP_PREFIX=/usr/local/hadoop
#HADOOP VARIABLES END

另外,我查看了我的java home配置,结果如下所示

sudo update-alternatives --config java
There are 3 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      auto mode
  1            /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java   1061      manual mode
  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1051      manual mode
* 3            /usr/lib/jvm/java-7-oracle/jre/bin/java          1         manual mode

所以我将bashrc和hadoop-env.sh文件中的所有JAVA_HOME值都更改为/usr/lib/jvm/java-7-oracle。我也确保Dfs和Yarn都已启动。

但是,当我使用此命令编译 WordCount.java时

hadoop com.sun.tools.javac.Main WordCount.java 

没有什么是我的方式。我收到了这个错误。请注意,我使用Hadoop命令代替bin / hadoop,因为命令工作正常,因为它是在bashrc文件中定义的。

Error: Could not find or load main class com.sun.tools.javac.Main

导致此错误的可能原因是什么?如何摆脱这种错误?我认为这可能是java类路径问题,但我仍然无法弄清楚细节。我得到的关于这个问题的每个解决方法都是关于执行javajavac命令,而不是hadoop命令。

我只是想让示例程序先运行,然后再开始学习它是如何工作的。任何帮助,将不胜感激。感谢..

7 个答案:

答案 0 :(得分:2)

尝试从hadoop目录执行

  

cd YARN_HOME   bin / hadoop jar absolute path to jar file WordCount input path output path in hdfs

查看以下链接 http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v2.0

答案 1 :(得分:2)

我认为Java没有正确启用。所以请转到hadoop-env.sh文件并启用java。另请检查java版本和jre版本。两者必须是相同的版本。

答案 2 :(得分:2)

Hadoop需要JAVA_HOME的jdk路径。确保您已设置jdk路径而不是jre。看来你手动安装了java。检查javac的版本以确保它已启用。

javac -version

检查similar answer

答案 3 :(得分:2)

Apache Hadoop tutorial假设环境变量设置如下:

export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar

也许我跟随的Digital Ocean hadoop tutorial应该建议将这两个后面的变量添加到〜/ .bashrc中,以便最终看起来像这样:

#HADOOP VARIABLES START
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar
export HADOOP_INSTALL=/usr/local/hadoop
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
#HADOOP VARIABLES END

它适用于我的安装。请参阅输出中列出的新编译类文件:

之前:

ubuntu@mail:/usr/local/hadoop$ ls
bin  include  lib      LICENSE.txt  NOTICE.txt  README.txt  share              WordCount.java
etc  input    libexec  logs         output      sbin        WordCount_classes

后:

ubuntu@mail:/usr/local/hadoop$ bin/hadoop com.sun.tools.javac.Main WordCount.java
ubuntu@mail:/usr/local/hadoop$ ls
bin      input    LICENSE.txt  output      share              WordCount$IntSumReducer.class
etc      lib      logs         README.txt  WordCount.class    WordCount.java
include  libexec  NOTICE.txt   sbin        WordCount_classes  WordCount$TokenizerMapper.class

另一个有用的资源是:

  

http://ubuntuforums.org/archive/index.php/t-634996.html附加   按照以下行打开.bashrc文件,保存并关闭:export   JAVA_HOME =“/ usr / lib / jvm / java-6-sun-1.6.0.22”导出   PATH = $ PATH:$ JAVA_HOME / bin在终端中发出以下命令:   来源$ HOME / .bashrc

     

请参阅此博客文章了解更多信息   (http://sureshatt.blogspot.com/2011/01/easiest-way-to-install-java-in-ubuntu.html

答案 4 :(得分:1)

Assuming you are using Eclipse or any other IDE
正如我在this帖子中提到的,与您的班级一起创建一个基于maven的简单wordcount项目 因此将处理所有依赖项。在项目上单击Right click并选择Export选项并输入名称<hadoop-example>.jar然后接下来,为您的wordcount项目生成一个jar文件。

  

您无需显式编译程序,   一旦导出成功,Eclipse将为您完成

如果您在同一台计算机上安装了hadoop,那么start all the daemons并使用jps检查是否所有后台程序都已启动。
否则将jar文件复制到安装hadoop的虚拟机。  转到jar位置并运行以下命令。

hadoop jar <hadoop-example>.jar <fully qualified main class name> hdfsInputPath hdfsOutputPath  

这将运行您的主要课程(在您的情况下为WordCount
应该使用上面的命令使用命令行运行任何hadoop程序,使用jar文件,然后使用主类名(WorkCount)。 导出jar文件时,可以将WordCount作为应用程序入口点Main类。因此,您无需提供完全合格的名称。就像这样。

hadoop jar <hadoop-example>.jar  hdfsInputPath hdfsOutputPath 

请尝试这一点并告诉我们是否对您有所帮助 更新:如评论中所述,IDE未使用。

  

您设置的上述路径由Map/Reduce在运行时使用   程序

但在你跑步之前,你应该制作一个需要所有家属进行编译的jar 因此,将一个变量作为HADOOP_CLASSPATH_LIBS并分配中的所有罐子  <installed-hadoop>/share/hadoop/<subfolder>/lib
For every jar, you should give the absolute path and export this variable
这将使您能够编译然后制作一个jar文件。一旦你有了jar,你可以按照上面的步骤来运行它。 如果需要更多帮助,可以提供帮助 希望它有所帮助。

答案 5 :(得分:0)

尝试设置HADOOP_CLASSPATH环境变量

export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar:<path to hadoop libs>

答案 6 :(得分:0)

Hadoop同时使用openjdk和oracle jdk,但你使用的是oracle jdk。 我有同样的问题,所以我做了以下事情。

1)export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
2)export PATH=${JAVA_HOME}/bin:${PATH}
3)export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

在终端中运行此命令后,您将能够编译java文件。 Hadoop无法找到正确的java路径,这就是您收到该错误的原因。