4

Windows で Eclipse を使用してプロジェクトをビルドし、Linux クラスターで実行しようとしています。このプロジェクトは、いくつかの外部 jar に依存しています。これは、Eclipse の「エクスポート -> 実行可能な JAR -> 必要なライブラリを jar にパッケージ化」ビルド オプションを使用して同封しました。jar にフォルダ構造内のクラスが含まれていること、および外部 jar がルート フォルダにあることを確認しました。

Hadoop スタンドアロン、Cygwin、および Linux では、これは正常に機能しますが、実際の Hadoop Linux クラスターでは、最初の外部 jar からクラスにアクセスしようとすると失敗し、ClassNotFoundException.

Hadoop に強制的に jar を検索させる方法はありますか?これでうまくいくと思いました。

10/07/16 11:44:59 INFO mapred.JobClient: Task Id : attempt_201007161003_0005_m_000001_0, Status : FAILED
Error: java.lang.ClassNotFoundException: org.jfree.data.xy.XYDataset
 at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
 at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
 at org.akintayo.analysis.ecg.preprocess.ReadPlotECG.plotECG(ReadPlotECG.java:27)
 at org.akintayo.analysis.ecg.preprocess.BuildECGImages.writeECGImages(BuildECGImages.java:216)
 at org.akintayo.analysis.ecg.preprocess.BuildECGImages.converSingleECGToImage(BuildECGImages.java:305)
 at org.akintayo.analysis.ecg.preprocess.BuildECGImages.main(BuildECGImages.java:457)
 at org.akintayo.hadoop.HadoopECGPreprocessByFile$MapTest.map(HadoopECGPreprocessByFile.java:208)
 at org.akintayo.hadoop.HadoopECGPreprocessByFile$MapTest.map(HadoopECGPreprocessByFile.java:1)
 at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
 at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
 at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
 at org.apache.hadoop.mapred.Child.main(Child.java:170)
4

2 に答える 2

3

Java は他の jar にある jar を使用できません:/ (クラスローダーはこれを処理できません)

したがって、これらのパッケージをクラスター内の各マシンに個別にインストールするか、実行時にjarを追加できない場合は、実行-libjars mylib.jar時にオプションを追加する必要がhadoop jar myjar.jar -libjars mylib.jarあり、これは機能するはずです。

于 2010-08-04T22:30:13.057 に答える
1

Wojtekの答えは正しいです。を使用-libjarsすると、外部 jar が分散キャッシュに配置され、すべての Hadoop ノードで使用できるようになります。

ただし、外部 jar が頻繁に変更されない場合は、jar ファイルをノードの hadoop/lib に手動でコピーする方が便利な場合があります。Hadoop を再起動すると、外部 jar がジョブのクラスパスに追加されます。

于 2011-09-27T20:07:13.857 に答える