Spring Boot集成Spark查询Cassandra遇NoClassDefFoundError问题求助
解决Spring Boot + Spark Cassandra查询时的NoClassDefFoundError问题
核心原因
这个异常是Spark Cassandra Connector与Datastax Java Driver版本不匹配,或是Spring Boot的依赖自动管理覆盖了驱动的正确版本,导致运行时找不到SimpleQueryPlan类。Spark 3.2.0对应的Cassandra Connector有固定的驱动版本要求,不能随意替换。
具体解决方案
1. 锁定兼容的依赖版本
Spark 3.2.0官方推荐的Cassandra Connector版本是3.2.0,它依赖的Datastax Java Driver版本为4.13.0。在pom.xml中明确指定这两个版本,同时排除Spring Boot可能引入的冲突依赖:
<dependencies> <!-- Spark Core --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.2.0</version> <scope>provided</scope> </dependency> <!-- Spark Cassandra Connector --> <dependency> <groupId>com.datastax.spark</groupId> <artifactId>spark-cassandra-connector_2.12</artifactId> <version>3.2.0</version> <!-- 排除冲突的驱动依赖 --> <exclusions> <exclusion> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-core</artifactId> </exclusion> <exclusion> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-query-builder</artifactId> </exclusion> </exclusions> </dependency> <!-- 指定兼容的Datastax Java Driver版本 --> <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-core</artifactId> <version>4.13.0</version> </dependency> <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-query-builder</artifactId> <version>4.13.0</version> </dependency> </dependencies>
2. 禁用Spring Boot的Cassandra自动配置
如果项目中使用了spring-boot-starter-data-cassandra,它会自动引入驱动,容易和Spark依赖的版本冲突。可以直接排除其自动配置类:
@SpringBootApplication(exclude = {CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 排查依赖冲突
用Maven命令查看依赖树,确认是否有其他依赖引入了不兼容的Datastax Driver版本:
mvn dependency:tree | grep "datastax"
如果发现冲突版本,在对应的依赖中添加<exclusion>标签排除掉。
4. 确保打包时依赖完整
如果打包成jar运行,需要保证spark-cassandra-connector和Datastax Driver的jar包能被正确加载。可以在Spring Boot打包插件中配置requiresUnpack:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <requiresUnpack> <dependency> <groupId>com.datastax.spark</groupId> <artifactId>spark-cassandra-connector_2.12</artifactId> </dependency> <dependency> <groupId>com.datastax.oss</groupId> <artifactId>java-driver-core</artifactId> </dependency> </requiresUnpack> </configuration> </plugin> </plugins> </build>
验证SparkSession配置
确保SparkSession的Cassandra连接参数配置正确,避免因配置问题间接引发类加载异常:
SparkSession spark = SparkSession.builder() .appName("CassandraQuery") .master("local[*]") // 生产环境替换为集群地址 .config("spark.cassandra.connection.host", "你的Cassandra地址") .config("spark.cassandra.connection.port", "9042") .config("spark.cassandra.auth.username", "你的用户名") .config("spark.cassandra.auth.password", "你的密码") .getOrCreate(); Dataset<Row> result1 = spark.read() .format("org.apache.spark.sql.cassandra") .option("keyspace", "你的keyspace") .option("table", "你的表名") .load(); result1.show();
内容的提问来源于stack exchange,提问作者Marcelino
相关产品推荐
相关产品推荐

