PySpark中如何解决‘No FileSystem for scheme: gs’错误?
No FileSystem for scheme: gs错误 我在PySpark 2.4.x环境里碰到过完全一样的问题,核心原因就是你的Spark环境缺少Google Cloud Storage(GCS)的连接器依赖,导致无法识别gs://文件协议。下面给你几个亲测有效的Python端解决方案,不用纠结Scala的配置或者复杂的core-site.xml修改:
方案1:启动脚本时直接指定依赖包(最快捷)
Spark支持通过--packages参数自动下载并加载Maven仓库中的依赖包。针对Spark 2.4.1,你需要用适配Hadoop 2.x的GCS连接器版本,直接在运行脚本时添加参数:
如果用spark-submit运行你的代码:
spark-submit --packages com.google.cloud.bigdataoss:gcs-connector:hadoop2-2.1.3 test_code.py
如果是直接启动PyShell测试:
pyspark --packages com.google.cloud.bigdataoss:gcs-connector:hadoop2-2.1.3
这个命令会自动下载连接器jar包并加载,不需要手动修改任何配置文件。
方案2:在代码中配置SparkConf加载依赖(适合固化配置)
如果你不想每次运行都加命令行参数,可以在代码里直接给SparkConf添加依赖和GCS相关配置。修改你的配置部分如下:
from pyspark import SparkConf from pyspark.sql import SparkSession conf = SparkConf().setAll([ ('spark.executor.memory', '16g'), ('spark.executor.cores','4'), ('spark.cores.max','4'), # 添加GCS连接器依赖 ('spark.jars.packages', 'com.google.cloud.bigdataoss:gcs-connector:hadoop2-2.1.3'), # 指定GCS文件系统实现类 ('spark.hadoop.fs.gs.impl', 'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem'), ('spark.hadoop.fs.AbstractFileSystem.gs.impl', 'com.google.cloud.hadoop.fs.gcs.GoogleHadoopFS'), # 如果你的Bucket是私有,需要配置服务账号认证(可选) ('spark.hadoop.google.cloud.auth.service.account.enable', 'true'), ('spark.hadoop.google.cloud.auth.service.account.json.keyfile', '/path/to/your/service-account-key.json') ]).setMaster('local[*]') spark = SparkSession.builder.config(conf=conf).getOrCreate()
注意:如果你的Bucket是公开可读的,服务账号配置可以省略;如果是私有Bucket,要确保你的服务账号拥有Storage Object Viewer权限,并且密钥文件路径正确。
方案3:手动下载jar包到Spark目录(永久生效)
如果你想让所有Spark任务都默认支持GCS,可以手动下载对应版本的连接器jar包,放到Spark的jars目录里:
- 下载适配Spark 2.4.1的
gcs-connector-hadoop2-2.1.3.jar - 把jar包复制到
$SPARK_HOME/jars目录下 - 重启你的Spark环境,之后运行代码就不用再指定依赖了
为什么之前修改core-site.xml没用?
大概率是你修改的不是Spark实际使用的core-site.xml文件。Spark默认会读取$SPARK_HOME/conf下的配置文件,如果你的环境是用Anaconda安装的Spark,可能配置路径不在常规位置。相比直接改配置文件,上面的Python端方案更可控,也更适合本地开发环境。
内容的提问来源于stack exchange,提问作者user3490622

