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

Spring Boot连接Spark集群时出现CassandraPartition类找不到异常

问题排查与解决方案

一、核心原因分析

java.lang.ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition 本质是Spark Executor节点无法加载spark-cassandra-connector的核心类,结合你的场景,主要由以下几点导致:

  1. 版本不兼容:Spark 3.1.3需要匹配对应版本的spark-cassandra-connector,版本错配会直接导致类缺失;
  2. Spring Boot打包结构问题:默认可执行Jar的依赖被打包在BOOT-INF/lib目录下,Spark集群无法识别该结构,无法将依赖分发到Executor;
  3. 依赖范围配置错误:如果spark-cassandra-connector被设为provided范围,而集群Executor节点未预先安装该依赖,就会触发报错。

二、依赖调整方案

1. 匹配正确的依赖版本

Spark 3.1.3官方推荐的兼容spark-cassandra-connector版本为3.1.2(Scala版本需与Spark一致,Spark 3.1.3默认用Scala 2.12),修改你的依赖配置:

<!-- Maven 示例 -->
<dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.12</artifactId>
    <version>3.1.2</version>
    <!-- 不要设为provided,除非集群所有节点已预装该依赖 -->
</dependency>

补充:Spring Boot 2.7.5对应的Spring Data Cassandra版本为4.4.5,该版本兼容Cassandra 4.0.1,无需调整这部分依赖。

2. 解决Spring Boot打包的依赖分发问题

Spring Boot可执行Jar的特殊结构会导致Spark无法识别依赖,推荐两种解决方式:

方式一:构建依赖分离的Jar包

通过spring-boot-maven-plugin配置,生成主Jar和单独的依赖目录:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>ZIP</layout>
        <includes>
            <include>
                <groupId>none</groupId>
                <artifactId>none</artifactId>
            </include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

打包后会得到your-project.jar(主程序Jar)和your-project-lib目录(存放所有依赖)。

方式二:通过Spark参数指定依赖

将spark-cassandra-connector的Jar包上传到集群可访问路径,或者在客户端模式下直接指定本地路径:

// 代码中配置示例
SparkSession spark = SparkSession.builder()
    .master("spark://<spark-master-ip>:7077")
    .appName("CassandraDataReader")
    .config("spark.jars", "/path/to/spark-cassandra-connector_2.12-3.1.2.jar")
    .config("spark.cassandra.connection.host", "<cassandra-cluster-ips>")
    .getOrCreate();

三、集群模式下java -jar运行命令示例

方式一(依赖分离Jar)

java -jar your-project.jar \
--master spark://spark-master:7077 \
--driver-class-path ./your-project-lib/* \
--conf spark.executor.extraClassPath=/opt/your-project-lib/* \
--conf spark.cassandra.connection.host=192.168.1.100,192.168.1.101

注意:spark.executor.extraClassPath的路径要对应集群节点上依赖目录的实际位置。

方式二(直接指定Connector Jar)

java -jar your-project.jar \
--master spark://spark-master:7077 \
--jars /opt/spark/jars/spark-cassandra-connector_2.12-3.1.2.jar \
--conf spark.cassandra.connection.host=192.168.1.100

四、额外验证项

  • 确认Spark集群所有Executor节点能访问Cassandra节点的9042端口;
  • 检查集群节点的Spark版本是否与本地一致(必须都是3.1.3)。

内容的提问来源于stack exchange,提问作者Nithin Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:51:16