部署Spark/Scala代码到GKE集群遇Scala版本兼容错误求助
Spark/Scala部署GKE集群的Scala版本兼容问题修复
问题背景
基于Apache Spark 3.3.2和Scala开发的代码,部署到GKE集群时因Scala版本不匹配出现两类错误,以下是相关配置及错误详情:
配置文件信息
Dockerfile
FROM apache/spark:v3.3.2 COPY target/*-shaded.jar /opt/spark/jars/app.jar ENV SPARK_HOME /opt/spark ENV PATH $PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin ENV JAR $SPARK_HOME/jars/app.jar ENV MAIN_CLASS=com.example.exe.SparkExample
pom.xml核心配置片段
<properties> <scala.version>2.13.10</scala.version> <scala.binary.version>2.13</scala.binary.version> <spark.version>3.3.2</spark.version> </properties> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scala.binary.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.binary.version}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <!-- 其他依赖省略 --> </dependencies> <profiles> <profile> <id>shadedbuild</id> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> <scope>provided</scope> </dependency> <!-- 其他profile依赖省略 --> </dependencies> </profile> </profiles>
错误现象
- 执行
mvn clean -P shadedbuild -B package打包部署后,运行时报错:Exception in thread "main" java.lang.NoSuchMethodError: 'scala.collection.immutable.ArraySeq scala.runtime.ScalaRunTime$.wrapRefArray(java.lang.Object[])' - 执行
mvn clean -B package打包时,直接报错:java.io.IOException: Scala signature package has wrong version expected: 5.0 found: 5.2 in scala.collection.immutable.package
错误原因
- 第一个错误:官方
apache/spark:v3.3.2镜像默认使用Scala 2.12版本,但pom.xml指定了Scala 2.13,运行时环境的Scala库与代码编译依赖版本不兼容,导致方法找不到。 - 第二个错误:未启用
shadedbuildprofile时,scala-library被打包进JAR,与Spark环境中已存在的不同版本Scala库冲突(Scala 2.12签名版本为5.0,2.13为5.2)。
修复方案
1. 统一Spark镜像与Scala版本
选择以下两种方案之一:
方案A:修改pom.xml适配镜像的Scala版本
将pom.xml中的Scala版本改为Spark镜像对应的2.12.x版本(Spark 3.3.2推荐使用Scala 2.12.17):
<properties> <scala.version>2.12.17</scala.version> <scala.binary.version>2.12</scala.binary.version> <spark.version>3.3.2</spark.version> </properties>
方案B:更换Spark镜像为Scala 2.13版本
修改Dockerfile的基础镜像为支持Scala 2.13的Spark 3.3.2镜像:
FROM apache/spark:3.3.2-scala2.13
2. 优化Maven打包配置
在shadedbuild profile中,将Spark核心依赖也标记为provided(集群环境已提供这些库),避免打包冲突:
<profile> <id>shadedbuild</id> <dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scala.binary.version}</artifactId> <version>${spark.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scala.binary.version}</artifactId> <version>${spark.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-reflect</artifactId> <version>${scala.version}</version> <scope>provided</scope> </dependency> </dependencies> </profile>
3. 重新打包部署
执行打包命令:
mvn clean -P shadedbuild -B package
重新构建Docker镜像并部署到GKE集群即可。
内容的提问来源于stack exchange,提问作者Jayachandran Nachimuthu
相关产品推荐
相关产品推荐

