SpringBoot + Spark on Yan踩坑记

本文详细记录了使用SpringBoot集成SparkStreaming、Kafka、Redis、HDFS,并在Spark on Yarn环境下运行时遇到的坑,包括logback与log4j冲突、GSON版本冲突、Hadoop版本冲突等问题,以及对应的解决策略。
摘要由CSDN通过智能技术生成
  • 终极目标
    采用SpringBoot集成SparkStreaming+Kafka+Redis+HDFS等组件,打包成jar(下文将之简称为“应用”),运行在Spark on Yan环境,实现离线+实时分布式计算。
    本文中采用Spark on Yan Client模式发布应用。
    参考文献:https://www.cnblogs.com/langfanyun/p/8040136.html
     
  • 第一坑:启动方式与local模式迥异
    local模式(setMaster("local[2]"))下,SpringBoot集成SparkStreaming的app与其他web应用无差异,直接java -jar xxx.jar即可启动。
    Spark on Yan环境下, 必须使用spark-submit等命令,由Spark-Yarn-Client托管应用的jar,否则,应用的jar中缺少向Yarn资源管理器申请资源的模块,无法正常启动。
    【对策】
    1)应用的pom中引入spark-yarn依赖

    <dependency>

        <groupId>org.apache.spark</groupId>

        <artifactId>spark-yarn_${scala.tools.version}</artifactId>

        <version>${spark.core.version}</version>

    </dependency>

    其中scala.tools.version为scala版本,spark.core.version为spark版本

     

    2)sparkConf设置yarn相关配置

    val conf = new SparkConf().setMaster("yarn-client").setAppName(sparkAppName)

    3)启动命令

    /bin/spark-submit --conf spark.yarn.jars="local:/opt/xxx/lib/spark/jars/*,local:/opt/xxx/lib/spark/hive/*,hdfs://xxx:8020/user/mypath/my-service/lib/*" --properties-file /home/mypath/spark.conf --driver-java-options "-Dorg.springframework.boot.logging.LoggingSystem=none -Dspring.profiles.active=test -Dspark.yarn.dist.files=/home/mypath/yarn-site.xml" --class org.springframework.boot.loader.JarLauncher --master yarn --deploy-mode client my-service-1.0.0-SNAPSHOT.jar

    各目录的说明:“/opt/xxx/lib/spark”部分为示例机器安装Spark的目录,根据实际情况修改即可。"hdfs://xxx:8020/user/mypath/my-service/lib"部分为示例机器hdfs上存储应用依赖的库文件的目录,根据实际情况修改即可。“/home/mypath/”部分为示例机器上存放spark配置文件的目录,根据实际情况修改即可。

    各参数的说明:“spark.yarn.jars”用于指定executor容器运行时依赖的jar的目录,特别是“hdfs://xxx:8020/user/mypath/my-service/lib/*”非常关键,后面将会讲到相关的各种坑。“--properties-file”指定spark自定义配置文件,可绕开许多坑,后面也会讲到。“--driver-java-options”用于指定应用的运行环境参数,绕坑专业户,且听下文分解。“–class”必须指定springboot的main所在class,否则就是坑。

     

  • 第二坑:logback和log4j冲突
    spark-submit内部使用log4j作为日志模块,SpringBoot默认采用logback作为日志模块,默认情况下将出现以下各种异常。

    java.lang.ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext

    ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext

    LoggerFactory is not a Logback LoggerContext but Logback...

    【对策】
    1)pom中绕开所有logback

    <exclusions>

        <exclusion>

            <groupId>ch.qos.logback</groupId>

           <artifactId>logback-classic</artifactId>

        </exclusion>

    </exclusions>

    2)springboot停止尝试加载任何logger

    具体办法是在启动命令中增加java参数org.springframework.boot.logging.LoggingSystem,指定为none即可。

    /bin/spark-submit ... --driver-java-options "-Dorg.springframework.boot.logging.LoggingSystem=none ..." ... my-service-1.0.0-SNAPSHOT.jar

  • 第三坑:GSON版本冲突
    Spark自带的GSON版本可能与SpringBoot依赖的版本冲突,引起如下异常:

    Failed to instantiate [com.google.gson.GsonBuilder

    【对策】
    将Spark自带的GSON库重命名

  • 第四坑:Hadoop版本冲突
    集群环境的Hadoop版本可能与应用依赖的版本冲突,引起如下异常&#

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值