- 终极目标
采用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版本可能与应用依赖的版本冲突,引起如下异常&#
SpringBoot + Spark on Yan踩坑记
最新推荐文章于 2024-08-05 11:18:55 发布
本文详细记录了使用SpringBoot集成SparkStreaming、Kafka、Redis、HDFS,并在Spark on Yarn环境下运行时遇到的坑,包括logback与log4j冲突、GSON版本冲突、Hadoop版本冲突等问题,以及对应的解决策略。
摘要由CSDN通过智能技术生成