0

JAR ファイルを使用して AWS Elastic Map Reduce で Hadoop ジョブを実行しようとしています。EJML https://code.google.com/p/effective-java-matrix-library/wiki/EjmlManualというライブラリを使用しています。project-->Build Path-->Configure Build Path--> Add Extrenal Jars in Eclipse を使用して、外部ライブラリとしてプロジェクトに含めました。ローカル コンピューターでプロジェクトを実行すると、すべて問題ありません。ただし、AWS ではエラーが発生します。

Exception in thread "main" java.lang.NoClassDefFoundError: org/ejml/simple/SimpleBase
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.util.RunJar.main(RunJar.java:180)
Caused by: java.lang.ClassNotFoundException: org.ejml.simple.SimpleBase
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 3 more

何がうまくいかないのだろうかと思っています。AWS の Hadoop は Java 6 でのみ実行されるため、Java 7 ではなく Java 6 をターゲットとするようにライブラリを再構築する必要がありました。ありがとう

編集: Eclipse で問題を解決する簡単な方法は、プロジェクトを JAR にエクスポートするときに、Runnable JAR ファイルのエクスポート オプションを選択することです。

4

2 に答える 2

2

デフォルトでは、サードパーティの依存関係はジョブ jar に含まれていないため、表示されるエラー メッセージが表示されます。Eclipse は実行時に jar をクラスパスに追加することを認識しているため、Eclipse スタンドアロン モードで動作します。

次の 2 つの選択肢があります。

  1. このjarを解凍し、クラスとサードパーティの依存関係jarを単一の「uber」またはモノリシックjarに再パックします-mavenには、これを行うためのjar-with-dependenciesアセンブリがあります(mavenを使用している場合、個人的にお勧めします)
  2. ジョブをサブミットするためのToolRunner-libjarsメソッドと組み合わせた引数を使用します。これにより、サードパーティの jar がジョブと共にサブミットされます。

    hadoop jar myJar.jar -libjars ejml.jar MainClass.class

于 2013-06-07T08:33:29.523 に答える
0

Hadoop ジョブを実行する前に、AWS 環境の Hadoop クラスパスに jar を追加する必要があります。

端末で、ジョブを実行する前にこれを行います。

export $EJML_JARS=<your jars here separated by colon ':'>
export HADOOP_CLASSPATH=$EJML_JARS

例えば

export EJML_JARS=name1.jar:name2.jar:name3.jar
export HADOOP_CLASSPATH=$EJML_JARS

次に、ジョブを起動します。

于 2013-06-07T09:09:59.133 に答える