PySpark读取GCS JSON文件时ClassNotFoundException问题求助
解决PySpark读取GCS文件时的ClassNotFoundException问题
问题根源
出现ClassNotFoundException: com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem的核心原因是:你的Spark集群缺少GCS Hadoop文件系统的依赖包,无法识别gs://协议对应的实现类。
解决方案
方式一:spark-submit时动态加载依赖(推荐,适合在线环境)
直接在spark-submit命令中通过--packages参数指定GCS连接器的依赖包,Spark会自动下载并加载该依赖。注意要选择与你的Hadoop版本(Hadoop3)匹配的连接器版本,比如hadoop3-2.2.10(适配Spark3.3.2+Hadoop3组合):
spark-submit --master spark://MacBook-User.local:7077 --packages com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.10 test2.py
方式二:手动添加依赖包到Spark(适合离线环境)
如果你的集群无法访问Maven仓库,可手动下载依赖包并部署:
- 下载适配Hadoop3的GCS连接器JAR包(选择与Spark 3.3.2兼容的版本,比如
hadoop3-2.2.10) - 将下载的JAR包复制到Spark安装目录的
jars文件夹下,比如:
cp /path/to/gcs-connector-hadoop3-2.2.10.jar /your/spark/path/spark-3.3.2-bin-hadoop3/jars/
- 重启Spark集群:先执行
./stop-slave.sh和./stop-master.sh停止服务,再重新启动./start-master.sh和./start-slave.sh spark://MacBook-User.local:7077 - 重新执行
spark-submit命令
验证你的test2.py配置
确保脚本中已正确配置GCS文件系统参数,示例代码片段:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("ReadGCSJSON") \ .getOrCreate() # 配置GCS文件系统核心参数 spark.conf.set("fs.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem") spark.conf.set("fs.AbstractFileSystem.gs.impl", "com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS") # 如果GCS桶需要认证,添加服务账号密钥配置(可选) # spark.conf.set("google.cloud.auth.service.account.json.keyfile", "/path/to/your-service-account-key.json") # 读取GCS中的JSON文件 df = spark.read.json("gs://testpysparkscript/test.json") df.show() spark.stop()
注意事项
- 版本匹配至关重要:必须选择与你的Hadoop版本(Hadoop3)对应的GCS连接器版本,避免使用hadoop2后缀的包,否则会出现兼容性问题
- 集群节点一致性:如果用方式二手动添加JAR包,所有Spark slave节点都需要放置相同的JAR包,否则会出现节点间依赖缺失的问题
- GCS权限验证:确保运行Spark的账号或配置的服务账号拥有
testpysparkscript桶的读取权限,否则会出现权限错误
内容的提问来源于stack exchange,提问作者KuRu
相关产品推荐
相关产品推荐

