• 为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
    
  • 相关阅读:
    Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
    RESTful风格、异常处理、Spring框架
    文件上传、数据校验(后台)、拦截器
    接收的参数为日期类型、controller控制层进行数据保存、进行重定向跳转
    SpringMVC入门Demo
    Mybatis入门Demo(单表的增删改查)
    Spring
    spring的exception
    restful风格
    Java后台验证
  • 原文地址:https://www.cnblogs.com/jasondan/p/spark-specific-jdk-version.html
Copyright © 2020-2023  润新知