Spring Boot连接Spark集群时出现CassandraPartition类找不到异常
问题排查与解决方案
一、核心原因分析
java.lang.ClassNotFoundException: com.datastax.spark.connector.rdd.partitioner.CassandraPartition 本质是Spark Executor节点无法加载spark-cassandra-connector的核心类,结合你的场景,主要由以下几点导致:
- 版本不兼容:Spark 3.1.3需要匹配对应版本的
spark-cassandra-connector,版本错配会直接导致类缺失; - Spring Boot打包结构问题:默认可执行Jar的依赖被打包在
BOOT-INF/lib目录下,Spark集群无法识别该结构,无法将依赖分发到Executor; - 依赖范围配置错误:如果
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
相关产品推荐
相关产品推荐

