Spark master和worker似乎运行在不同的JVM版本

时间:2017-06-09 14:55:03

标签: apache-spark

在独立模式下,主进程使用解析为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的链接。这解决了这个问题,但仍然想知道为什么两个进程都使用不同的二进制位置,这是设置的位置。

1 个答案:

答案 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
  • ...


附注: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.

...前提是已为启动Spark奴隶的Linux帐户正确定义$PATH