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

Spark无法使用AWS Profile访问S3问题求助

解决Spark通过AWS Profile访问S3的认证问题

你的问题核心是:Spark的Hadoop S3A客户端默认不会自动读取本地AWS配置文件中的Profile,尤其是AWS SSO生成的临时凭证,需要添加特定配置来启用Profile支持。

直接修改你的Spark配置,添加关键参数即可解决:

修改后的Spark完整代码

conf = SparkConf()
conf.setAll([
    ("spark.jars.packages", "org.apache.hadoop:hadoop-aws:3.3.4,org.apache.hadoop:hadoop-common:3.3.4"),
    ("spark.hadoop.fs.s3a.endpoint","s3.us-east-1.amazonaws.com"),
    ("spark.hadoop.fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem"),
    # 启用AWS Profile凭证提供者,支持读取本地配置的Profile
    ("spark.hadoop.fs.s3a.aws.credentials.provider", "com.amazonaws.auth.profile.ProfileCredentialsProvider"),
    # 指定要使用的AWS Profile名称
    ("spark.hadoop.fs.s3a.profile.name", "my-profile"),
    # 可选:如果AWS配置文件不在默认路径~/.aws/config,需指定路径
    # ("spark.hadoop.fs.s3a.profile.path", "/your/custom/path/.aws/config"),
    ("spark.executor.cores",1)
])

spark = SparkSession.builder \
        .master('local[*]')\
        .config(conf=conf) \
        .appName("Api-app-1") \
        .getOrCreate()

s3_file_name = os.path.join('s3a://',s3_bucket,s3_path,file_name)
df = spark.read.format("csv").option("header", "true").load(s3_file_name)
df.show()
spark.stop()

关键说明

  1. ProfileCredentialsProvider:这个凭证提供者会读取本地AWS配置文件(~/.aws/config)和SSO缓存的临时凭证(~/.aws/cache),完全匹配你用boto3时的认证逻辑。
  2. SSO登录状态:运行Spark代码前,确保本地AWS SSO处于登录状态,执行过aws sso login --profile my-profile,否则缓存的临时凭证过期会导致认证失败。
  3. 权限检查:确保运行Spark的用户有读取~/.aws/config和~/.aws/cache目录的权限,否则无法加载凭证。

报错原因解析

默认情况下,Hadoop S3A的凭证提供者链里没有包含ProfileCredentialsProvider,只会尝试从环境变量、实例IAM角色等途径获取凭证,而你的SSO凭证仅存在于本地Profile配置和缓存中,因此触发了"No AWS Credentials provided"错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:25:59