我使用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位置。
答案 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”文件夹应该是第一级文件夹