我使用 java 文件创建了一个 jar 文件这个博客 http://java.dzone.com/articles/hadoop-basics-creating使用以下语句
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
Output:
Warning: $HADOOP_HOME is deprecated.
RunJar jarFile [mainClass] args...
2.hduser@ubuntu:~$ /usr/local/hadoop/bin/hadoop jar Dictionary.jar Dictionary
Output:
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 位置。
我能够重现你的问题。问题是你在哪里创建罐子。
基本上,您打包到 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
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)