PySpark连接Cassandra报NoClassDefFoundError:util/logging错误
问题记录
已下载spark-cassandra-connector_3.12-3.2.0.jar包,存放至/apache-spark/3.2.1/libexec/jars目录,通过如下Spark配置引入该jar包:
conf=SparkConf().setAppName("d").setMasetMaster("local") .set("spark.driver.extraClassPath", "jarPath/spark-cassandra-connector_3.12-3.2.0.jar")
执行Cassandra数据查询操作时抛出报错:
Py4j.protocol.PyJJavaError: An error occurred while calling o114.load. :Java.lang.NoClassDefFoundError: com/datastax/spark/connector/util/logging
问题根因
- 配置存在笔误:
setMasetMaster为错误写法,正确方法名为setMaster - 包名错误:不存在适配Scala 3.12版本的Cassandra连接器,Spark 3.2.x适配的连接器Scala版本为2.12,手动下载的jar包本身版本标识错误
- 依赖缺失:仅引入连接器主jar包不会自动加载其传递依赖,报错缺失的类属于连接器的依赖组件,未被引入到类路径中
- 路径配置错误:配置中使用了占位符
jarPath,未替换为jar包实际存放的绝对路径,JVM无法定位到目标jar文件 - 类路径配置不全:本地运行模式下仅配置driver端类路径,未配置executor端类路径,会导致executor侧加载不到依赖类
修复方案
优先选择自动依赖管理方式,避免手动导包遗漏依赖:
- 删除手动下载的错误版本jar包,提交Spark任务时添加
--packages参数,自动拉取适配版本的连接器及所有传递依赖,示例命令:
spark-submit --packages com.datastax.spark:spark-cassandra-connector_2.12:3.2.0 你的脚本文件名.py
该参数会自动拉取对应版本连接器的所有依赖到本地缓存,driver和executor端都能正常加载,不会出现类缺失问题。
如果必须使用本地手动导包的方式,按如下步骤调整:
- 下载正确版本的连接器包:
spark-cassandra-connector_2.12-3.2.0.jar,同时下载该包所有传递依赖jar包,全部放到/apache-spark/3.2.1/libexec/jars目录下 - 修正代码中的配置笔误,替换占位符路径为实际绝对路径,同时配置driver和executor两端的类路径,示例代码:
from pyspark import SparkConf, SparkSession import os spark_jar_dir = "/apache-spark/3.2.1/libexec/jars" # 拼接目录下所有jar包为类路径 class_path = ":".join([os.path.join(spark_jar_dir, f) for f in os.listdir(spark_jar_dir) if f.endswith(".jar")]) conf = SparkConf()\ .setAppName("d")\ .setMaster("local")\ .set("spark.driver.extraClassPath", class_path)\ .set("spark.executor.extraClassPath", class_path) spark = SparkSession.builder.config(conf=conf).getOrCreate()
- 启动任务后可在Spark UI的Environment页签核对两端类路径配置,确认连接器jar包已被正确加载,再执行Cassandra查询即可。
内容的提问来源于stack exchange,提问作者Starter_F
相关产品推荐
相关产品推荐

