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独立模式后出现类找不到错误。集群搭建步骤:
- 下载Spark 3.3.1
- 按官方文档手动启动独立集群
错误信息
[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
相关产品推荐
相关产品推荐

