如何在hadoop中运行jar文件?

Ari*_*ant 11 java hadoop jar

我使用以下语句使用此博客中的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...  
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我怎么能在hadoop中运行jar?根据我的程序需要,我有正确的DFS位置.

Abh*_*ain 20

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

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

/usr/lib/jvm/jdk1.7.0_07/bin/jar cf Dictionary.jar /home/hduser/dir/Dictionary.class
Run Code Online (Sandbox Code Playgroud)

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

/usr/local/hadoop/bin/hadoop jar Dictionary.jar Dictionary
Run Code Online (Sandbox Code Playgroud)

只要你的类中有一个名为Dictionary的main函数,它就可以正常工作.

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


小智 7

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

hadoop jar <jarFileName> <mainClassname> <AnyCommandLineArguements>
Run Code Online (Sandbox Code Playgroud)