Sparklyr连接Cassandra查询数据时出现NoClassDefFoundError求助
问题描述
- 本地运行Spark独立实例(版本3.2.1),使用sparklyr(1.8.1)可正常执行内存读写、表创建、Kafka流处理等操作
- 本地Cassandra已搭建完成,测试表创建后可通过cqlsh正常连接操作
- 通过sparklyr配置连接Cassandra后,能获取表元数据,但执行数据查询、加载到内存等操作时,抛出错误:
java.lang.NoClassDefFoundError: org/apache/spark/sql/connector/read/partitioning/KeyGroupedPartitioning - 直接使用spark-shell搭配相同版本的Spark-Cassandra连接器(3.3.0)可正常查询数据
环境信息:
- R 4.3.0,Linux Mint 21.1
- R包:sparklyr_1.8.1,dplyr_1.1.2,DBI_1.1.3
- Spark版本:3.2.1
- Spark-Cassandra连接器版本:3.3.0
故障原因
错误中的KeyGroupedPartitioning类是Spark 3.3.0及以上版本才新增的API类,当前使用的Spark 3.2.1并不包含该类。Spark-Cassandra连接器3.3.0基于Spark 3.3+开发,因此在Spark 3.2.1环境中调用连接器的查询逻辑时,会因找不到该类抛出错误。
至于spark-shell能正常运行的原因,大概率是spark-shell实际使用的Spark版本为3.3+(可能与本地配置的Spark版本不一致),或者在spark-shell中误使用了适配Spark3.2.x的连接器版本。
解决办法
方案1:降级Spark-Cassandra连接器版本
将连接器更换为适配Spark3.2.x的版本(如3.2.0),该版本不会依赖Spark3.3+的新增类。在sparklyr连接时指定该版本的jar包:
sc <- spark_connect( master = "local[*]", version = "3.2.1", packages = "com.datastax.spark:spark-cassandra-connector_2.12:3.2.0" )
方案2:升级Spark版本
将本地Spark版本升级到3.3.0及以上,与当前使用的Spark-Cassandra连接器3.3.0版本匹配,确保API类存在。
方案3:检查spark-shell的实际配置
确认spark-shell使用的Spark版本和连接器版本是否与sparklyr一致,排查版本混淆情况,避免后续配置出现偏差。
内容的提问来源于stack exchange,提问作者James75
相关产品推荐
相关产品推荐

