前言
随着企业内部业务系统越来越多,基于JVM的服务,通常情况线上环境可能会有多套JDK跑不同的服务。大家都知道基于高版本的Java规范编写的服务跑在低版本的JVM上会出现:java.lang.UnsupportedClassVersionError的异常。
Spark 2.2开始移除了对Java 7的支持,大多数情况下,我们的Spark Application是和Hadoop系统公用的JDK,如果Hadoop依赖的JDK版本是7,那我们基于JDK 8编写的Application跑在上面就会出问题。
该文主要介绍在不同的场景下,如何为Spark Application指定不同的JDK版本。
集群已部署了指定的JDK版本
假设集群中每个节点JDK的部署路径为:/usr/java/jdk1.8
Spark提供了spark.executorEnv.[EnvironmentVariableName]配置,可以用来给Executor进程添加环境变量,如果Spark Application使用的集群管理器是Standalone,只需要通过spark.executorEnv.JAVA_HOME制定Executor端的jdk路径即可,如下:
$SPARK_HOME/bin/spark-submit \
--conf "spark.executorEnv.JAVA_HOME=/usr/java/jdk1.8" \
...
在YARN模式下,还需要为Application Master指定不同的JAVA_HOME环境变量,如下:
$SPARK_HOME/bin/spark-submit \
--conf "spark.executorEnv