最近遇到一个bug,自己编写的spark程序本地调试没问题之后想提交到集群上运行,报错内容如下:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/iteblog/mobile/UserMobileInfo : Unsupported major.minor version 52.0
现特此整理了一下分享给大家:
其实报错已经很明显了,java8版本有问题,那具体原因是什么呢,其实就是本地编写spark用的是java8,但是集群上使用的版本不是java8,然后就去集群服务器上看了一眼,发现有两个版本的java,一个是1.7的,还有一个是1.8的,那用的估计是1.7的就会导致不支持,那怎么才能使用1.8的呢?下面针对不同情况分别介绍:
Spark
第一种方法:只要加上spark.executorEnv.JAVA_HOME和spark.yarn.appMasterEnv.JAVA_HOME两个参数即可,这分别代表的是Spark的Executor和Driver的JDK路径,具体如下:
$SPARK_HOME/bin/spark-submit --master yarn-cluster \
第二种方法:将上面两个参数的配置加到$SPARK_HOME/conf/spark_default.conf文件当中就可以了
MapReduce
可以通过mapreduce程序里面的Configuration设置,具体设置如下:
conf.set("mapred.child.env","JAVA_HOME=/home/iteblog/java/jdk1.8.0_25")
conf.set("yarn.app.mapreduce.am.env","JAVA_HOME=/home/iteblog/java/jdk1.8.0_25")
Flink
Flink也是支持自定义JAVA_HOME,我们可以在$FLINK_HOME/conf/flink-conf.yaml,设置如下:
env.java.home: /home/iteblog/java/jdk1.8.0_25
注意:上面所有的jdk路径全都是集群上的jdk的绝对路径