0

classnotfound 例外が発生しています。見つからないと主張されているクラスは存在しませんが、クラス名はマップ削減ジョブの入力ファイルのリストへのパスとして設定されています。

INFO  server Running: /usr/lib/hadoop/bin/hadoop --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf jar tmp.jar /user/hduser/datasets/ /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20

Exception in thread "main" java.lang.ClassNotFoundException: /user/hduser/datasets/

at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(Runjar.java:190)

ご覧のとおり、/user/hduser/datasets/は入力ファイルへのパスです。なぜこのエラーが発生するのClassNotFoundExceptionですか? なぜそれをクラスと見なすのですか?


私は自分のエラーを見つけました。私はパッケージ構造を持っています。パッケージ情報を指定する必要があります

/usr/lib/hadoop/bin/hadoop 
    --config /var/run/cloudera-scm-agent/process/155-hue/JOBSUBD/hadoop-conf 
    jar tmp.jar org.myorg.tmp /user/hduser/datasets/ 
    /user/hduser/tmp/job_20/ mongodb://slave15/db_8.job_20

私のツールでは、パッケージを引数として Java に渡すオプションはありません。だから私は包装をする必要はありません。しかし、この入力ファイルパスの前の引数が欠落しているため、次のエラーが発生しています。

私のクラスは、ルートの tmp.jar に直接あります。つまり、org.myorgなどはありません...

解決:

jar cmf [manifest_file] [jar_name.jar] -C [folder_of_classes] [path_for_jar_file]

manifest_file の内容を、jar アーカイブ内の生成されたマニフェスト ファイルとマージします。manifest_file Main-Class に次の行を含めます: [Name_Of_Class]

4

1 に答える 1

2

パッケージ階層があるかどうかに関係なく (存在しない場合は何か問題があります) 、 を含むクラスの名前を付ける必要がありますmain

たとえば、ドキュメントには、メイン クラスが である例がありorg.myorg.WordCountます。デフォルトのパッケージに含まれていたとしてもWordCount、jar ファイルのマニフェストにメイン クラスが含まれていない場合は指定する必要があります。

bin/hadoop jar /usr/joe/wordcount.jar WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output

任意の jar と同様に、マニフェストでメイン クラスを指定することもできると思います。class 引数は、同じドキュメントではオプションとして示されています。

于 2012-06-11T10:15:55.360 に答える