前言
Spark社区的快速发展给我带来越来越快,越来越方便的大数据处理工具的同时,也带来了不小的麻烦,一季度一个小版本,半年一个大版本,新版本JDK7说不要就不要了。要知道在大公司生产环境下升级一个JDK版本,那可是天大的事儿,这口锅谁都不敢背。
一般的生产环境,Spark以跑在YARN上为主,YARN的环境也不能说动就能,因为也不止Spark一种类型的App泡在YARN上,在加上复杂的各种Hadoop生态,升级起来就更加费劲了。本文介绍在不改变YARN的NodeManager环境变量的前提下,以不同的JDK运行Spark Applications on Yarn。
相关配置
Configuration | Default Value | Meaning |
---|---|---|
spark.yarn.appMasterEnv. |
无 | 设置ApplicationMaster的环境变量 |
spark.executorEnv. |
无 | 设置executor的环境变量 |
利用上述配置,我们就可以更改相关container的环境变量,包括我们的JAVA_HOME
试验
yarn端配置
export JAVA_HOME=/usr/jdk64/jdk1.7.0_67
spark客户端配置
export JAVA_HOME=/usr/jdk64/jdk1.7.0_67
或者
export JAVA_HOME=/home/hadoop/jdk1.8.0_144
bin/spark-sql
默认情况下,直接使用yarn端配置
image.png
bin/spark-sql --conf spark.yarn.appMasterEnv.JAVA_HOME=/home/hadoop/jdk1.8.0_144 修改am的jdk,显示executor container没有变化
image.pngbin/spark-sql --conf spark.yarn.appMasterEnv.JAVA_HOME=/home/hadoop/jdk1.8.0_144 --conf spark.executorEnv.JAVA_HOME=/home/hadoop/jdk1.8.0_144
同时修改
image.png
最后
另外一种方法时通过 --archives或spark.yarn.dist.archives 上传jdk的压缩包,例如
--archives path/to/jdk-8u77-linux-x64.tar.gz
or
--conf spark.yarn.dist.archives=path/to/jdk-8u77-linux-x64.tar.gz
然后可以通过指定
spark.yarn.appMasterEnv.JAVA_HOME=./jdk-8u77-linux-x64.tar.gz/jdk-8u77-linux-x64
spark.executorEnv.JAVA_HOME=./jdk-8u77-linux-x64.tar.gz/jdk-8u77-linux-x64
该方式先上传到yarn distribute cache,进而会被拉到各container的working dir 所以可以通过./jdk-8u77-linux-x64.tar.gz取到该文件,然后通过其解压后的目录jdk-8u77-linux-x64进行访问。
获取将jdk压缩包取个文件别名,如
--archives path/to/jdk-8u77-linux-x64.tar.gz#JDK8U77
就变成了
spark.yarn.appMasterEnv.JAVA_HOME=./JDK8U77/jdk-8u77-linux-x64
spark.executorEnv.JAVA_HOME=./JDK8U77/jdk-8u77-linux-x64
这种方案相对比较灵活,特别是对于yarn集群没有管理权限的时候,但是提交过程上传进200M的jdk还是需要花不少时间的。
所以最后我们可以将其放到hdfs上,如hdfs://nn/path/to/jdk-8u77-linux-x64.tar.gz
--archives hdfs://nn/path/to/jdk-8u77-linux-x64.tar.gz
这种方式下,container下载这个jdk当然还是需要时间的,但是对于yarn集群的内网网络环境而言,应该还是比较轻松的。
网友评论