2016-05-07 13 views
0

私はjavaで書いたjarをロードするspark scalaプログラムを持っています。そのjarファイルから直列化オブジェクトを読み込もうとしたが、java.lang.ClassNotFoundExceptionがスローされた静的関数が呼び出されます。 sparkプログラムはローカルでは動作しますが、クラスタワーカーでは動作しません。ファイルから読み込もうとする前に、私はPatternオブジェクトをインスタンス化していて問題はないので、特に奇妙です。sparkクラスタでプログラムを実行しているときにjava.lang.ClassNotFoundExceptionが発生しました

ファイルに書き込んだPatternのオブジェクトは、私が読もうとしているオブジェクトのPatternと同じであると確信しています。

スレーブマシンのjarファイルを確認しました。Patternクラスがあります。

問題が何であるか考えている人はいますか?必要に応じて詳細を追加できます。

これは私が次のようにS3からファイルを読んでいPatternクラス

public class Pattern implements Serializable { 
private static final long serialVersionUID = 588249593084959064L; 

public static enum RelationPatternType {NONE, LEFT, RIGHT, BOTH}; 
RelationPatternType type; 
String entity; 
String pattern; 
List<Token> tokens; 
Relation relation = null; 

public Pattern(RelationPatternType type, String entity, List<Token> tokens, Relation relation) { 
    this.type = type; 
    this.entity = entity; 
    this.tokens = tokens; 
    this.relation = relation; 
    if (this.tokens != null) 
     this.pattern = StringUtils.join(" ", this.tokens.toString()); 
} 

}

です:

AmazonS3 s3Client = new AmazonS3Client(credentials); 
S3Object confidentPatternsObject = s3Client.getObject(new GetObjectRequest("xxx","confidentPatterns")); 
objectData = confidentPatternsObject.getObjectContent(); 
ois = new ObjectInputStream(objectData); 
confidentPatterns = (Map<Pattern, Tuple2<Integer, Integer>>) ois.readObject(); 

LE:私は、ランタイムおよびパスにクラスパスをチェックします瓶にはそこにいませんでした。私はエグゼクティブのために追加しましたが、私はまだ同じ問題を抱えています。 readObject関数を呼び出しているJarファイルの中にPatternクラスがあるので、私はそうは思わない。

+0

クラスターの場合はクラスパスにクラスがありますか? –

+0

パターンは自分のクラスの権利ですか? JDKのものではありませんか? –

+0

それはクラスタ内で実行されている瓶の中にあるので、それにアクセスする必要があると推測します – Tomy

答えて

1

が、これはすべてがビューの呼び出し側の視点から罰金であることを確認するために、呼び出しの前にクラスパスリソースを見つけるために、この種のメソッドを追加することをお勧め

public static void printClassPathResources() { 
     final ClassLoader cl = ClassLoader.getSystemClassLoader(); 
     final URL[] urls = ((URLClassLoader) cl).getURLs(); 
     LOG.info("Print All Class path resources under currently running class"); 
     for (final URL url : urls) { 
      LOG.info(url.getFile()); 
     } 

    } 
  • これは、サンプルの構成スパーク1.5
  • です

--conf "spark.driver.extraLibrayPath=$HADOOP_HOME/*:$HBASE_HOME/*:$HADOOP_HOME/lib/*:$HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar:$HDFS_PATH/*:$SOLR_HOME/*:$SOLR_HOME/lib/*" \ --conf "spark.executor.extraLibraryPath=$HADOOP_HOME/*" \ --conf "spark.executor.extraClassPath=$(echo /your directory of jars/*.jar | tr ' ' ',')

  • このTrouble shooting guideによって記載されているように:が見つかりませんでしたクラス:スパークプログラムをコンパイルするときにもう1つの一般的な問題は、クラスが定義されていない見ているクラスパスの問題 それはあなたのプロセスを実行する際、火花が実際にいくつかのJVMのを実行しているので、これは少し混乱トピックで、それぞれのパスが正しい必要があります。通常、これは依存関係をエグゼキュータに正しく渡すために発生します。 Spark Contextの作成に使用されたSparkConfオブジェクトで、依存関係のすべてを含んだ太いJar(sbtアセンブリの使用をお勧めします)が含まれていることを確認してください。あなたはスパークアプリケーションでこのような行を書き終わる必要があります:

val conf = new SparkConf().setAppName(appName).setJars(Seq(System.getProperty("user.dir") + "/target/scala-2.10/sparktest.jar"))

これは、クラスが見つからない問題の大半を修正する必要があります。もう1つの選択肢は、クラスター内のすべてのワーカー・ノードのデフォルトのクラスパスに依存関係を置くことです。あなたは大きな瓶の周りを回る必要はありませんこのように。

クラスが見つかりませんでしたその他の主な問題は、使用しているライブラリのバージョンによって異なります。たとえば、アプリケーションで共通ライブラリの同じバージョンを使用していない場合、sparkサーバーでクラスパスの問題が発生します。これは、あるバージョンのライブラリ(Spark 1.1.0など)に対してコンパイルし、異なるバージョンまたは古いバージョン(Spark 0.9.2など)のクラスタに対して実行しようとすると発生します。エグゼキュータのクラスパスにロードされているものとライブラリのバージョンを一致させてください。これの一般的な例は、Spark Cassandra Connectorのアルファビルドに対してコンパイルし、古いバージョンへのクラスパス参照を使用して実行しようとしています。

+0

これを使ってクラスパスを出力しました。瓶への道はそこになかった。私はそれを加えました、そして私はまだ同じ問題を抱えています。 – Tomy

+0

spark-submitコマンドをここに貼り付けることはできますか? driverClassPath、executorClassPathなどのようなクラスパスオプションを使用しています... –

+0

〜/ spark/bin/spark-submit --jars /root/work/project-1.0-SNAPSHOT.jar --class peoplegraph.Main - ドライバメモリ50gパイプライン - 1.0.jar と私はこのようなクラスパスを設定しました: conf.set( "spark.executor.extraClassPath"、 "./") – Tomy

関連する問題