2017-06-09 4 views
0

スタンドアロンモードのマスタープロセスでは、/usr/bin/javaがJVM 1.8に解決され、ワー​​カープロセス/usr/lib/jvm/java/bin/javaは1.7に解決されます。私のSparkアプリケーションでは、1.8で導入されたいくつかのAPIを使用しています。スパークのマスターとワーカーが異なるJVMバージョンで実行されているようです

スタックトレースを見ると、次のような行が表示されます。Caused by: java.lang.NoClassDefFoundError: Could not initialize class SomeClassDefinedByMe内部ではjava.timeのインスタンスが作成されていますが、これはJDK 1.8のみと考えられます。

ワーカーにJVM 1.8を強制的に使用させるにはどうすればよいですか?

更新: 今の私は/usr/lib/jvm/java/bin/javaと改名し、/usr/bin/javaを指すリンクを作成しました。これは問題を解決しましたが、なぜ両方のプロセスが異なるバイナリロケーションを使用するのか、そしてこのセットがどこにあるのかを知りたいと思います。

答えて

0

各ワーカーノードで、${SPARK_HOME}/conf/spark-env.shを編集し、適切な$JAVA_HOMEを定義します。

一人ひとりスパークコマンドラインユーティリティによって呼び出されるファイルは ${SPARK_HOME}/bin/load-spark-env.shによって供給される

export JAVA_HOME=/usr/bin/java

${SPARK_HOME}/bin/spark-class

  • 経由${SPARK_HOME}/bin/spark-class
  • ${SPARK_HOME}/bin/spark-submit経由

    • ${SPARK_HOME}/bin/spark-shell ...
    • ${SPARK_HOME}/sbin/start-slave.sh
    • ...


    サイドノート:LinuxのalternativesはJVMがPATHの一番上にあるかを定義するための標準的な方法です... "固定" に設定して

    典型的なセットアップ、 OpenJDKのRPMが設定した優先順位に頼らないインストール:

    $ ls -AFl $(which java) 
    lrwxrwxrwx. 1 root root 22 Feb 15 16:06 /usr/bin/java -> /etc/alternatives/java* 
    
    $ alternatives --display java | grep -v slave 
    java - status is manual. 
    link currently points to /usr/java/jdk1.8.0_92/jre/bin/java 
    /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java - priority 18091 
    /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java - priority 16000 
    /usr/java/jdk1.8.0_92/jre/bin/java - priority 18092 
    Current `best' version is /usr/java/jdk1.8.0_92/jre/bin/java. 
    

    は... $PATHてSPを起動し、Linuxのアカウントに対して適切に定義されていることを提供箱舟の奴隷!

  • 関連する問題