12

我使用以下语句使用此博客中的 java 文件创建了一个 jar 文件

javac -classpath /usr/local/hadoop/hadoop-core-1.0.3.jar -d /home/hduser/dir Dictionary.java

/usr/lib/jvm/jdk1.7.0_07/bin/jar cf Dictionary.jar /home/hduser/dir

现在我尝试通过点击和试用各种命令在 hadoop 中运行这个 jar

1hduser@ubuntu:~$ /usr/local/hadoop/bin/hadoop jar Dictionary.jar

输出:

Warning: $HADOOP_HOME is deprecated.

RunJar jarFile [mainClass] args...  

2.hduser@ubuntu:~$ /usr/local/hadoop/bin/hadoop jar Dictionary.jar Dictionary

输出:

Warning: $HADOOP_HOME is deprecated.

Exception in thread "main" java.lang.ClassNotFoundException: Dictionary
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.hadoop.util.RunJar.main(RunJar.java:149)

如何在 hadoop 中运行 jar?根据我的程序的需要,我有正确的 DFS 位置。

4

3 回答 3

20

我能够重现您的问题。问题是您在哪里创建 jar。

基本上,您要打包到 jar 中的目录会使 jar 文件在定位主类文件时感到困惑。相反,如果您尝试这样做:

/usr/lib/jvm/jdk1.7.0_07/bin/jar cf Dictionary.jar /home/hduser/dir/Dictionary.class

即专门将class文件打包到jar中,然后运行:

/usr/local/hadoop/bin/hadoop jar Dictionary.jar Dictionary

只要您的类中有一个名为 Dictionary 的主要功能,它就可以正常工作。

问题是当您将完整目录打包到 jar 中时,jar 还需要了解目录结构以定位类文件。为此,我们需要有一个定义良好的包层次结构来定义类位置。因此,当您打包/home/hduser/dir/到 jar 中时,jar 不知道位于该目录结构深处的类文件的位置。为此,您需要.java根据目录结构将包名称添加到文件中,例如home.hduser.dir,并在运行hadoop jar命令时指定具有包结构的类名称,例如home.hduser.dir.Dictionary

于 2012-10-23T10:32:31.377 回答
8

使用以下命令从CLI运行 hadoop jar 文件。

hadoop jar <jarFileName> <mainClassname> <AnyCommandLineArguements>
于 2015-08-10T11:41:46.057 回答
1

我也遇到了同样的问题,控制台没有显示太多信息,只是

RunJar jarFile [mainClass] 参数...

请检查 jar 中的包文件夹位置,作为一种简单的方法,请尝试以 com.company 开头的包...

“com”文件夹应该是jar解包时的第一级文件夹

于 2014-08-11T09:11:46.947 回答