You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署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>

错误现象

  1. 执行mvn clean -P shadedbuild -B package打包部署后,运行时报错:
    Exception in thread "main" java.lang.NoSuchMethodError: 'scala.collection.immutable.ArraySeq scala.runtime.ScalaRunTime$.wrapRefArray(java.lang.Object[])'
    
  2. 执行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库与代码编译依赖版本不兼容,导致方法找不到。
  • 第二个错误:未启用shadedbuild profile时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:35:53