私はEclipseでMapReduceプログラムを構築しており、jarを独自の実行構成で実行可能なjarとしてエクスポートしようとしています。実行構成で、メイン クラスを指定し、エクスポートされた jar を取得して、hadoop/playground フォルダーにドロップします。このコマンドで実行しようとすると:
hadoop jar playground/MyProg.jar "packageinfo" "input" "output"
入力パスが存在しないという PrivilegedAccessException が常に発生します。パッケージ構造と「入力」パスと「出力」パスの両方を確認しました。エクスポートされたjarの構造に関係していると思われます。
次の 2 つのコマンドを使用するのは非常に不便です。
$ javac -classpath *:lib/* -d playground/classes playground/src/WordCount.java
$ jar -cvf playground/WordCount.jar -C playground/classes/ .
これは、私の MapReduce プログラムが複雑になるにつれて特に当てはまります。
PrivilegedAccessExceptionを取得しないように、適切なディレクトリ構造でEclipseからjarをエクスポートする特定の方法があるかどうか疑問に思っていました。私にとって MapReduce 自体の開発は容易になってきていますが、デバッグ、デプロイ、テストは、特にすべてのターミナルとファイル システムのコマンドが非常に難解な Linux 環境では非常に困難であることが判明しています。このプロセスを理解するのに役立つすべての情報に感謝します。
MyJob.jar という名前のアプリケーションを実行しようとしたときのサンプル エラー メッセージは次のとおりです。
hadoop jar playground/MyJob.jar src.main.myjob.MyJob /usr/root/MyJob/cite75_99.txt /usr/root/MyJob/cite75_99OUT.txt
Warning: $HADOOP_HOME is deprecated.
13/09/28 15:20:13 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/09/28 15:20:14 INFO util.NativeCodeLoader: Loaded the native-hadoop library
13/09/28 15:20:14 WARN snappy.LoadSnappy: Snappy native library not loaded
13/09/28 15:20:14 INFO mapred.JobClient: Cleaning up the staging area hdfs://localhost:9000/tmp/hadoop-root/mapred/staging/root/.staging/job_201309281443_0007
13/09/28 15:20:14 ERROR security.UserGroupInformation: PriviledgedActionException as:root cause:org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/root/src.main.myjob.MyJob
Exception in thread "main" org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/root/src.main.myjob.MyJob
at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:197)
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:208)
at org.apache.hadoop.mapred.JobClient.writeOldSplits(JobClient.java:1081)
at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:1073)
at org.apache.hadoop.mapred.JobClient.access$700(JobClient.java:179)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:983)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:936)
at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:910)
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1353)
at src.main.myjob.MyJob.run(MyJob.java:87)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at src.main.myjob.MyJob.main(MyJob.java:94)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:160)