Spark 设置指定 JDK 的正确姿势

这两天在测试环境提交 Spark Streaming 任务时,遇到了一个 JDK 版本问题导致 job 一直提交失败。

我们使用的组件版本:

Spark 2.12

Elasticsearch 6.3.23

JDK1.8.0_162

查看 ApplicationMaster 日志,找到报错信息:

java.lang.UnsupportedClassVersionError: org/elasticsearch/client/RestHighLevelClient : Unsupported major.minor version 52.0
Unsupported major.minor version 52.0

没错,一看便知和 JDK 版本有关系。因为任务是输出到 ES,起初猜测是 ES 对 JDK 要求高,节点环境中的 JDK 低了、不能满足 ES 要求。

还是到 ES 官网查看了下,官网文档针对 ES 6.3.2 版本的 Java 版本建议是这样的:" We recommend installing Java version 1.8.0_131 or a later version in the Java 8 release series.  "

对比我们自己使用的 Java 版本 1.8.0_162,是能够满足要求的。

于是便能比较肯定的锁定问题是:Spark自身没有设置好 Java 版本。这里一般是由于编译打包 Spark 程序时的 Java 版本和运行程序时的 Java 版本不一致导致的。

先来看看我们刚开始提交任务的脚本:

#!/bin/bashexport JAVA_HOME=/usr/java/jdk1.8.0_162spark2-submit \ --master yarn \ --deploy-mode cluster \ --executor-cores 1 \ --executor-memory 1g \ --driver-memory 1g \ --conf spark.dynamicAllocation.maxExecutors=2 \ --conf spark.locality.wait.node=0 \ --conf spark.executor.userClassPathFirst=true \ --conf spark.driver.userClassPathFirst=true \ --files app.properties \ --jars protobuf-java-3.0.2.jar \ --class com.bigdata.note.sink.es.streaming.Sink2TestES \ --name Sink2TestES \ data-sink-es.jar!/bin/bash

export JAVA_HOME=/usr/java/jdk1.8.0_162
spark2-submit \
 --master yarn \
 --deploy-mode cluster \
 --executor-cores 1 \
 --executor-memory 1g \
 --driver-memory 1g \
 --conf spark.dynamicAllocation.maxExecutors=2 \
 --conf spark.locality.wait.node=0 \
 --conf spark.executor.userClassPathFirst=true \
 --conf spark.driver.userClassPathFirst=true \
 --files app.properties \
 --jars protobuf-java-3.0.2.jar \
 --class com.bigdata.note.sink.es.streaming.Sink2TestES \
 --name Sink2TestES \
 data-sink-es.jar

看样子我们好像已经设置了任务的 JAVA_HOME,但实际上这里并没有起作用。运行的时候仍然会报上述异常。怎么才能确定任务具体使用的是哪个 JDK 呢,还是要查看 ApplicationMaster 日志:

19/07/19 16:59:10 INFO zookeeper.ZooKeeper: Client environment:java.version=1.7.0_6719/07/19 16:59:10 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Oracle Corporation19/07/19 16:59:10 INFO zookeeper.ZooKeeper: Client environment:java.home=/usr/java/jdk1.7.0_67-cloudera/jre
19/07/19 16:59:10 INFO zookeeper.ZooKeeper: Client environment:java.home=/usr/java/jdk1.7.0_67-cloudera/jre

 

设置 JDK 的正确姿势

经过一番思索,想起只是设置 JAVA_HOME 好像不行,还要在命令行里配置一些 JAVA_HOME 的参数,参考了之前提交任务的脚本,最终找到了设置 JAVA_HOME 的正确方法:

#!/bin/bashspark2-submit \ --master yarn \ --deploy-mode cluster \ --executor-cores 1 \ --executor-memory 1g \ --driver-memory 1g \ --conf spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8.0_162 \ --conf spark.executorEnv.JAVA_HOME=/usr/java/jdk1.8.0_162 \ --conf spark.dynamicAllocation.maxExecutors=2 \ --conf spark.locality.wait.node=0 \ --conf spark.executor.userClassPathFirst=true \ --conf spark.driver.userClassPathFirst=true \ --files app.properties \ --jars protobuf-java-3.0.2.jar \ --class com.bigdata.note.sink.es.streaming.Sink2TestES \ --name Sink2TestES \ data-sink-es.jar!/bin/bash

spark2-submit \
 --master yarn \
 --deploy-mode cluster \
 --executor-cores 1 \
 --executor-memory 1g \
 --driver-memory 1g \
 --conf spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8.0_162 \
 --conf spark.executorEnv.JAVA_HOME=/usr/java/jdk1.8.0_162 \
 --conf spark.dynamicAllocation.maxExecutors=2 \
 --conf spark.locality.wait.node=0 \
 --conf spark.executor.userClassPathFirst=true \
 --conf spark.driver.userClassPathFirst=true \
 --files app.properties \
 --jars protobuf-java-3.0.2.jar \
 --class com.bigdata.note.sink.es.streaming.Sink2TestES \
 --name Sink2TestES \
 data-sink-es.jar

设置上面的这两个参数:spark.yarn.appMasterEnv.JAVA_HOME 与 spark.executorEnv.JAVA_HOME,它们的含义分别是指定 Driver 端、Excutor 端的 JDK 路径。通过这样的参数设置,测试下来去掉 export JAVA_HOME 后任务仍然能够正常执行。

参考 https://www.iteblog.com/archives/1883.html


往期推荐

1、HBase最佳实践 | 聊聊HBase核心配置参数
2、Apache Hudi:剑指数据湖的增量处理框架
3、Hadoop社区比 Ozone 更重要的事情
4、MapReduce Shuffle 和 Spark Shuffle 结业篇

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值