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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:13:10