Spark 3.3.2连接AWS S3遇权限报错求助(已排除权限本身问题)
Spark 3.3.2 连接S3报Access Denied的解决方案(已排除权限问题)
1. 严格匹配Hadoop版本
Spark 3.3.2-bin-hadoop3自带的Hadoop版本是3.3.2,hadoop-aws的版本必须与Spark自带的Hadoop版本完全一致,不能随意更换为3.3.1或3.3.5。版本不匹配会导致签名算法、API兼容性问题,这是触发Access Denied的常见原因。
修正启动命令(注意修正拼写错误--pakages为--packages,无需额外指定hadoop-common):
pyspark --packages org.apache.hadoop:hadoop-aws:3.3.2
2. 简化配置,避免冲突与错误
你之前的配置存在重复项和格式错误,以下是精简后的正确配置:
spark = SparkSession.builder .appName("aws_s3") .config('spark.sql.codegen.wholeStage', False) .getOrCreate() # 仅保留必要配置,移除重复项 spark._jsc.hadoopConfiguration().set("fs.s3a.access.key", "mykey") spark._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "mysecret") # 修正Endpoint格式:必须带s3前缀 spark._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.eu-west-3.amazonaws.com")
关键修正点:
- 移除重复的密钥配置(
fs.s3a.awsAccessKeyId与fs.s3a.access.key是同一配置的不同写法,保留一个即可) - 修正Endpoint格式:S3区域Endpoint必须以
s3.开头,你之前的eu-west-3.amazonaws.com会导致请求发送到错误地址,触发权限拒绝 - 移除不必要的配置:Hadoop 3+默认启用V4签名,无需手动设置
com.amazonaws.services.s3.enableV4;fs.s3a.impl和credentials.provider在默认场景下无需指定,避免冲突
3. 验证配置与测试
在代码中添加打印语句,确认配置是否生效:
# 打印关键配置,确认是否正确加载 print("S3 Access Key:", spark._jsc.hadoopConfiguration().get("fs.s3a.access.key")) print("S3 Endpoint:", spark._jsc.hadoopConfiguration().get("fs.s3a.endpoint"))
用最简操作测试连接,比如读取一个已知存在的文件:
df = spark.read.text("s3a://your-bucket-name/test-file.txt") df.show()
4. 额外排查点
- 确认S3桶的区域确实是
eu-west-3,避免区域不匹配导致的签名失败 - 虽然Boto3能访问,但可确认EC2安全组允许出站访问S3(默认S3是公开服务,一般没问题,但可排除极端情况)
内容的提问来源于stack exchange,提问作者aga
相关产品推荐
相关产品推荐

