You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hadoop3 gcs-connector在Spark3独立模式下异常求助

问题:Spark独立模式下无法加载GCS连接器类

环境版本

  • JDK 17
  • Scala 2.12.17
  • Spark SQL 3.3.1
  • hadoop3-2.2.7版本的gcs-connector(因特定问题未使用2.2.9版本)

问题背景

应用在本地模式运行正常,切换至Spark独立模式后出现类找不到错误。集群搭建步骤:

  1. 下载Spark 3.3.1
  2. 按官方文档手动启动独立集群

错误信息

[error] Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found
[error]         at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2688)
[error]         at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:3431)
[error]         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:3466)
[error]         at org.apache.hadoop.fs.FileSystem.access$300(FileSystem.java:174)
[error]         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:3574)
[error]         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:3521)
[error]         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:540)
[error]         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:365)
[error]         at org.apache.parquet.hadoop.util.HadoopInputFile.fromStatus(HadoopInputFile.java:44)
[error]         at org.apache.spark.sql.execution.datasources.parquet.ParquetFooterReader.readFooter(ParquetFooterReader.java:44)
[error]         at org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat$.$anonfun$readParquetFootersInParallel$1(ParquetFileFormat.scala:484)
[error]         ... 14 more
[error] Caused by: java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found
[error]         at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2592)
[error]         at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2686)
[error]         ... 24 more

核心问题:java.lang.ClassNotFoundException: Class com.google.cloud.hadoop.fs.gcs.GoogleHadoopFileSystem not found

当前Spark配置

spark.app.name = "Example app"
spark.master = "spark://YOUR_SPARK_MASTER_HOST:7077"
spark.hadoop.fs.defaultFS = "gs://YOUR_GCP_BUCKET"
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"
spark.hadoop.google.cloud.auth.service.account.enable = true
spark.hadoop.google.cloud.auth.service.account.json.keyfile = "src/main/resources/gcp_key.json"

解决方案

1. 提交应用时携带依赖jar包

使用spark-submit命令时,通过--packages参数直接从Maven仓库拉取依赖,或用--jars指定本地jar包路径(需确保所有集群节点能访问该路径):

spark-submit \
  --class com.your.package.YourApp \
  --master spark://YOUR_SPARK_MASTER_HOST:7077 \
  --packages com.google.cloud.bigdataoss:gcs-connector:hadoop3-2.2.7 \
  your-app.jar

2. 将jar包放入Spark全局classpath

把gcs-connector的jar包复制到Spark安装目录的jars文件夹,然后重启Spark集群的master和worker节点,所有应用会默认加载该依赖。

3. 配置Spark额外类路径

在spark-defaults.conf中添加以下配置,指定驱动和执行器的额外类路径:

spark.driver.extraClassPath=/path/to/gcs-connector-hadoop3-2.2.7.jar
spark.executor.extraClassPath=/path/to/gcs-connector-hadoop3-2.2.7.jar

注意:所有worker节点上的对应路径必须存在该jar包。

4. 修正密钥文件路径

独立模式下,src/main/resources/gcp_key.json是本地相对路径,worker节点无法访问。需将密钥文件放在所有节点可访问的共享路径,或配置为绝对路径。

内容的提问来源于stack exchange,提问作者Bogdan Senyshyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:05:27