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

使用PySpark访问公开AWS S3桶时遭遇403权限错误求助

解决Docker化Spark读取公开S3桶的403权限问题

核心原因

Spark依赖的Hadoop S3A客户端默认会尝试加载AWS凭证,即使目标桶是公开可匿名访问的,这就导致了配置凭证为空或设为"none"时的权限报错。

具体解决步骤

1. 强制Spark使用匿名凭证访问

在PySpark脚本或spark-submit参数中配置Hadoop S3A客户端使用匿名凭证提供者,彻底跳过凭证校验:

脚本内配置示例

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("ReadPublicS3Binary") \
    # 指定S3A文件系统实现类
    .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
    # 启用匿名凭证提供者
    .config("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider") \
    # 部分公开桶需要路径风格访问(避免虚拟主机风格的解析问题)
    .config("spark.hadoop.fs.s3a.path.style.access", "true") \
    .getOrCreate()

# 读取二进制文件(binaryFile格式会保留文件路径和内容)
binary_df = spark.read.format("binaryFile").load("s3a://your-public-bucket/**/*")
binary_df.show(5)

spark-submit命令行配置示例

spark-submit \
    --conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem \
    --conf spark.hadoop.fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider \
    --conf spark.hadoop.fs.s3a.path.style.access=true \
    your_pyspark_script.py

2. 确保Hadoop S3A依赖完整

Docker官方Spark镜像可能缺少Hadoop与S3交互的核心依赖包,需补充以下jar包(版本需匹配Hadoop 3.3.4):

  • hadoop-aws-3.3.4.jar
  • aws-java-sdk-bundle-1.12.592.jar

自定义Docker镜像示例

FROM apache/spark:3.5.3-hadoop3.3

# 下载依赖到Spark jars目录
RUN wget -P $SPARK_HOME/jars/ https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar
RUN wget -P $SPARK_HOME/jars/ https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.12.592/aws-java-sdk-bundle-1.12.592.jar

如果不想重新构建镜像,也可以在启动Spark时通过--jars参数指定本地或网络路径的jar包。

3. 验证桶的公开访问配置

确认目标S3桶的策略允许匿名读取对象,且未开启“阻止所有公共访问”:

  • 桶策略需包含允许所有用户读取对象的规则:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::your-public-bucket/*"
            }
        ]
    }
    
  • 在AWS控制台的桶“权限”页面,确保“阻止公共访问”选项全部关闭。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:32:35