如何在hadoop中运行jar文件?

时间:2012-10-22 13:29:20

标签: java jar hadoop

我使用this blog中的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

1 hduser@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位置。

3 个答案:

答案 0 :(得分:20)

我能够重现你的问题。问题是你在创建jar的地方。

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

/usr/lib/jvm/jdk1.7.0_07/bin/jar cf Dictionary.jar /home/hduser/dir/Dictionary.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

答案 1 :(得分:7)

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

hadoop jar <jarFileName> <mainClassname> <AnyCommandLineArguements>

答案 2 :(得分:1)

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

RunJar jarFile [mainClass] args ...

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

解压缩jar时,“com”文件夹应该是第一级文件夹