在独立模式下,主进程使用解析为JVM 1.8的/usr/bin/java
和解析为1.7的工作进程/usr/lib/jvm/java/bin/java
。在我的Spark应用程序中,我正在使用1.8中引入的一些API。
查看堆栈跟踪出现的一行是:Caused by: java.lang.NoClassDefFoundError: Could not initialize class SomeClassDefinedByMe
,它在内部创建来自java.time
的实例,我相信它只在JDK 1.8中。
如何强制worker使用JVM 1.8?
更新:
现在我重命名为/usr/lib/jvm/java/bin/java
并创建了一个指向/usr/bin/java
的链接。这解决了这个问题,但仍然想知道为什么两个进程都使用不同的二进制位置,这是设置的位置。
答案 0 :(得分:0)
在每个工作节点上,编辑${SPARK_HOME}/conf/spark-env.sh
并定义适当的$JAVA_HOME
,例如
export JAVA_HOME=/usr/bin/java
该文件由${SPARK_HOME}/bin/load-spark-env.sh
提供,每个Spark命令行实用程序都会调用该文件:
${SPARK_HOME}/bin/spark-shell
通过${SPARK_HOME}/bin/spark-class
${SPARK_HOME}/bin/spark-submit
通过${SPARK_HOME}/bin/spark-class
${SPARK_HOME}/sbin/start-slave.sh
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.
...前提是已为启动Spark奴隶的Linux帐户正确定义$PATH
!