- 终极目标
采用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 =newSparkConf().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"--classorg.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.LoggerContextClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContextLoggerFactory 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版本可能与应用依赖的版本冲突,引起如下异常:HftpFileSystem cannot access its superinterface【原因】应用依赖了2.6.x版本,而集群环境的是3.0.x
【对策】修改应用pom文件,将hadoop版本改为与集群环境一致 -
第五坑:运行时抛如下找不到ExecutorLauncher异常
SpringBoot + Spark on Yan踩坑记
本文详细记录了使用SpringBoot集成SparkStreaming、Kafka、Redis、HDFS,并在Spark on Yarn环境下运行时遇到的坑,包括logback与log4j冲突、GSON版本冲突、Hadoop版本冲突等问题,以及对应的解决策略。

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



