PySpark用Minio作Delta Lake存储后端时遇S3AFileSystem类找不到错误
解决方案:Class org.apache.hadoop.fs.s3a.S3AFileSystem not found 错误
核心问题分析
- 版本不匹配:本地安装的PySpark(3.2.3)与系统中的Spark(3.3.1)版本不一致,指定的
hadoop-aws:3.3.1与PySpark自带的Hadoop版本(spark-3.2.3-bin-hadoop3.2)冲突,导致依赖加载失败。 - 配置时机错误:
spark.hadoop.fs.s3a.impl需要在SparkSession初始化前配置,创建后通过spark.conf.set设置无法生效。 - Minio缺失关键配置:Minio需要开启路径风格访问,否则无法正确识别存储路径。
分步解决
1. 统一Spark与PySpark版本
卸载当前版本,安装与系统Spark匹配的包:
pip uninstall -y pyspark delta-spark pip install pyspark==3.3.1 delta-spark==2.2.0
2. 修改代码配置
调整依赖版本、提前配置S3A相关参数,并添加Minio必需的路径风格配置:
import pyspark from delta import * builder = pyspark.sql.SparkSession.builder.appName("MyApp") \ # 匹配Spark 3.3.1对应的Hadoop 3.3.2版本,同时指定Delta依赖 .config("spark.jars.packages", "org.apache.hadoop:hadoop-aws:3.3.2,io.delta:delta-core_2.12:2.2.0") \ .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \ .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \ .config("spark.hadoop.fs.s3a.access.key", "<my key>") \ .config("spark.hadoop.fs.s3a.secret.key", "<my secret>") \ .config("spark.hadoop.fs.s3a.endpoint", "<my endpoint>") \ # Minio必须开启路径风格访问 .config("spark.hadoop.fs.s3a.path.style.access", "true") \ .config("spark.databricks.delta.retentionDurationCheck.enabled", "false") \ # 提前配置S3A实现类,确保初始化时加载 .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") spark = builder.getOrCreate() data = spark.range(0, 5) # 写入Minio的Delta路径 data.write.format("delta").save("s3a://<my bucket>/delta-lake/demo") # 读取时使用相同的Minio路径,而非本地路径 df = spark.read.format("delta").load("s3a://<my bucket>/delta-lake/demo") df.show()
3. 备选方案:手动添加依赖Jar包
如果自动下载依赖失败,可手动下载对应版本的Jar包放入Spark的jars目录(如C:/Spark/spark-3.3.1-bin-hadoop3.2/jars):
hadoop-aws-3.3.2.jaraws-java-sdk-bundle-1.11.901.jarjackson-databind-2.13.2.2.jar
重启应用后重新运行代码。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

