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

今、私はこのjarファイルをhadoopで実行して、さまざまなコマンドを試してみました

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

つまり、クラス ファイルを明確に jar にパッケージ化してから実行します。

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

Dictionary と呼ばれるクラスに main 関数があれば、問題なく動作します。

問題は、jar 内に完全なディレクトリをパッケージ化する場合、jar もディレクトリ構造を認識してクラス ファイルを見つける必要があることです。このためには、クラスの場所を定義するために、明確に定義されたパッケージ階層が必要です。そのため、jar にパッケージ/home/hduser/dir/化する場合、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] args...

パッケージ フォルダーの場所については jar を確認してください。簡単な方法として、パッケージが com.company で始まることを試してください。

「com」フォルダーは、jar が解凍されたときの最初のレベルのフォルダーである必要があります。

于 2014-08-11T09:11:46.947 に答える