我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么为Spark Application指定不同的JDK版本

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么为Spark Application指定不同的JDK版本

这篇文章主要介绍了怎么为Spark Application指定不同的JDK版本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

随着企业内部业务系统越来越多,基于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.JAVA_HOME=/usr/java/jdk1.8" \ --conf "spark.yarn.appMasterEnv.JAVA_HOME=/usr/java/jdk1.8" \ ...

以cluster的方式部署在YARN上的时候,spark.yarn.appMasterEnv.JAVA_HOME相当于为Spark Application的Driver设置了特定的JDK版本;

以client的模式部署时,spark.yarn.appMasterEnv.JAVA_HOME仅仅是为Executor Launcher设置了特定的JDK版本。

Driver端的JDK版本和spark-submit所在的机器中的SPARK_HOME环境变量一致,直接在spark-env.sh中指定即可。

集群缺失特定的JDK版本,且对集群无管理权限

某些特殊的场景下,我们对集群没有管理权限,只能通过YARN提交Application,并且集群里没有部署我们需要的JDK版本,这种情形就需要将JDK的安装包也一并提交了。

这里要求我们的JDK安装包必须为gz格式的,和你代码打包后的jar包放在同一目录下,假设我们下载的JDK的安装包为:jdk-8u141-linux-x64.tar.gz。

关键配置如下:

$SPARK_HOME/bin/spark-submit \ --conf "spark.yarn.dist.archives=jdk-8u141-linux-x64.tar.gz" \ --conf "spark.executorEnv.JAVA_HOME=./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141" \ --conf "spark.yarn.appMasterEnv.JAVA_HOME=./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141" \ ...

我们可以通过指定spark.yarn.dist.archives配置,将JDK的安装包分发到所有Executor的工作目录下(包括Application Master的Executor),另外tar.gz的压缩包也会被自动解压,假设jdk-8u141-linux-x64.tar.gz解压后的目录为jdk1.8.0_141,那么我们特定的JDK的目录就是:./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141,不同的JDK版本以此类推即可。

注意:由于Spark Standalone没有提供分发JDK安装包并自动解压的功能,所以,这种方式只能用在YARN下。

验证

通过ps -ef grep查询相关进程信息,可以看到java的启动路径为我们特定JDK目录的java表示配置成功。

如下是我在YARN模式下,单独指定JDK版本的Executor的进程启动信息:

stan  590751 590745 0 20:45 ?  00:00:14 ./jdk-8u141-linux-x64.tar.gz/jdk1.8.0_141/bin/java -server -Xmx512m -XX:+UseG1GC -XX:+UnlockDiagnosticVMOptions -XX:+G1SummarizeConcMark -XX:InitiatingHeapOccupancyPercent=35 -XX:PermSize=256M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:./gc.log -verbose:gc -Djava.io.tmpdir=/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/tmp -Dspark.driver.port=52986 -Dspark.yarn.app.container.log.dir=/home/stan//hadoop-2.6.4/logs/userlogs/application_1508397483453_0095/container_1508397483453_0095_01_000004 -XX:OnOutOfMemoryError=kill %p org.apache.spark.executor.CoarseGrainedExecutorBackend --driver-url spark://CoarseGrainedScheduler@10.0.0.110:52986 --executor-id 3 --hostname stan --cores 1 --app-id application_1508397483453_0095 --user-class-path file:/home/stan/tmp/hadoop-stan/nm-local-dir/usercache/stan/appcache/application_1508397483453_0095/container_1508397483453_0095_01_000004/__app__.jar

附:spark application运行时版本不兼容错误的解决方法

17/06/27 14:34:41 INFO deprecation: mapred.map.tasks is deprecated. Instead, use mapreduce.job.maps 17/06/27 14:34:41 INFO MemoryStore: Block broadcast_0 stored as values in memory (estimated size 788.8 KB, free 1246.5 MB) 17/06/27 14:34:41 INFO MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 54.0 KB, free 1246.4 MB) 17/06/27 14:34:41 INFO BlockManagerInfo: Added broadcast_0_piece0 in memory on 10.50.70.121:37335 (size: 54.0 KB, free: 1247.2 MB) 17/06/27 14:34:41 INFO SparkContext: Created broadcast 0 from rdd at TradeInfoOutlier.scala:30 Exception in thread "main" java.lang.NoSuchMethodError: scala.reflect.api.JavaUniverse.runtimeMirror(Ljava/lang/ClassLoader;)Lscala/reflect/api/JavaUniverse$JavaMirror; at com.fangdd.data.profile.outlier.TradeInfoOutlier$.main(TradeInfoOutlier.scala:30) at com.fangdd.data.profile.outlier.TradeInfoOutlier.main(TradeInfoOutlier.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:745) at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 17/06/27 14:34:42 INFO SparkContext: Invoking stop() from shutdown hook

这种错误是由于生产环境采用的是scala 2.10 + spark1.6.3的运行环境,本地打的application jar使用scala2.11 + spark.1.6.3的编译环境,所以放入生产环境集群报了上述错误,更改scala版本重新打jar包后运行成功

感谢你能够认真阅读完这篇文章,希望小编分享的“怎么为Spark Application指定不同的JDK版本”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么为Spark Application指定不同的JDK版本

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么为Spark Application指定不同的JDK版本

这篇文章主要介绍了怎么为Spark Application指定不同的JDK版本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言随着企业内部业务系统越来越多,基于JVM的服务
2023-05-30

maven打包怎么指定jdk的版本

这篇文章主要讲解了“maven打包怎么指定jdk的版本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“maven打包怎么指定jdk的版本”吧!maven打包指定jdk的版本问题今天遇到个问题,
2023-07-05

怎么为Centos安装指定版本的Docker

这篇文章主要介绍“怎么为Centos安装指定版本的Docker”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么为Centos安装指定版本的Docker”文章能帮助大家解决问题。安装 Docker移
2023-06-29

Win10怎么同时安装两个版本的JDK并随时切换

本篇内容主要讲解“Win10怎么同时安装两个版本的JDK并随时切换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Win10怎么同时安装两个版本的JDK并随时切换”吧!一,官网下载两个版本的JDK
2023-07-05

怎么在Linux中切换相同程序的不同版本

这篇文章主要为大家展示了“怎么在Linux中切换相同程序的不同版本”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么在Linux中切换相同程序的不同版本”这篇文章吧。使用 update-alte
2023-06-16

怎么在Ubuntu中安装不同的PHP版本

这篇文章主要介绍“怎么在Ubuntu中安装不同的PHP版本”,在日常操作中,相信很多人在怎么在Ubuntu中安装不同的PHP版本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在Ubuntu中安装不同的PH
2023-06-15

Hybris怎么维护同一个文本基于不同语言的版本

本篇内容主要讲解“Hybris怎么维护同一个文本基于不同语言的版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hybris怎么维护同一个文本基于不同语言的版本”吧!i18n(其来源是英文单词
2023-06-04

阿里云数据库的不同版本怎么用

阿里云数据库是阿里云提供的一种云端数据库服务,它支持多种不同的数据库引擎,包括关系型数据库(RDS)、NoSQL数据库(MongoDB、Redis、HBase)等。在选择使用阿里云数据库时,我们需要根据自己的业务需求和数据特点选择合适的数据库版本。RDS版本RDS是阿里云提供的关系型数据库服务,它支持MySQL、SQL
阿里云数据库的不同版本怎么用
2024-01-29

怎么在ubuntu中切换使用不同版本的python

这篇文章主要介绍“怎么在ubuntu中切换使用不同版本的python”,在日常操作中,相信很多人在怎么在ubuntu中切换使用不同版本的python问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在ubun
2023-07-05

使用java怎么指定不同长度的二维数组

本篇文章给大家分享的是有关使用java怎么指定不同长度的二维数组,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序
2023-06-06

利用python怎么将MySQL指定的表增量同步数据到clickhouse脚本

本篇文章为大家展示了利用python怎么将MySQL指定的表增量同步数据到clickhouse脚本,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python实现MySQL指定表增量同步数据到clic
2023-06-06

spring-boot-maven-plugin未指定版本导致的编译错误问题怎么解决

本篇内容主要讲解“spring-boot-maven-plugin未指定版本导致的编译错误问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring-boot-maven-plugi
2023-07-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录