Java from this blog を使用して次のステートメントを使用して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)
Jarをhadoopで実行するにはどうすればよいですか?私のプログラムの必要に応じて、適切なDFSロケーションがあります。
私はあなたの問題を再現することができました。問題は、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
辞書と呼ばれるクラスにメイン関数がある場合、問題なく動作します。
問題は、jar内に完全なディレクトリをパッケージ化する場合、jarもクラスファイルを見つけるためにディレクトリ構造を認識する必要があることです。このためには、クラスの場所を定義するために、明確に定義されたパッケージ階層が必要です。そのため、/home/hduser/dir/
をjarにパッケージ化する場合、jarはこのディレクトリ構造の奥にあるクラスファイルの場所を認識しません。このためには、ディレクトリ構造に従って.Java
ファイルにパッケージ名を追加する必要があります。たとえば、home.hduser.dir
、およびhadoop jar
コマンドの実行中に、パッケージ構造でクラス名を指定します。たとえば、home.hduser.dir.Dictionary
。
以下のコマンドを使用して、hadoop jarファイルを[〜#〜] cli [〜#〜]から実行します。
hadoop jar <jarFileName> <mainClassname> <AnyCommandLineArguements>
私も同じ問題に遭遇し、コンソールには多くの情報は表示されませんが、
RunJar jarFile [mainClass] args ...
パッケージフォルダーの場所のjarを確認してください。直接的なアプローチは、パッケージがcom.company ...で始まることを試してください...
Jarファイルを解凍すると、「com」フォルダが最初のレベルのフォルダになります