前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark 设置指定 JDK 的正确姿势

Spark 设置指定 JDK 的正确姿势

作者头像
大数据技术架构
发布2019-08-16 16:01:46
2.3K0
发布2019-08-16 16:01:46
举报

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

我们使用的组件版本:

代码语言:javascript
复制
Spark 2.1
Elasticsearch 6.3.2
JDK1.8.0_162

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

代码语言:javascript
复制
java.lang.UnsupportedClassVersionError: org/elasticsearch/client/RestHighLevelClient : 
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 版本不一致导致的。

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

代码语言:javascript
复制
#!/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 日志:

代码语言:javascript
复制
19/07/19 16:59:10 INFO zookeeper.ZooKeeper: Client environment:java.version=1.7.0_67
19/07/19 16:59:10 INFO zookeeper.ZooKeeper: Client environment:java.vendor=Oracle Corporation
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 的正确方法:

代码语言:javascript
复制
#!/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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档