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()
关键说明
- ProfileCredentialsProvider:这个凭证提供者会读取本地AWS配置文件(
~/.aws/config)和SSO缓存的临时凭证(~/.aws/cache),完全匹配你用boto3时的认证逻辑。 - SSO登录状态:运行Spark代码前,确保本地AWS SSO处于登录状态,执行过
aws sso login --profile my-profile,否则缓存的临时凭证过期会导致认证失败。 - 权限检查:确保运行Spark的用户有读取
~/.aws/config和~/.aws/cache目录的权限,否则无法加载凭证。
报错原因解析
默认情况下,Hadoop S3A的凭证提供者链里没有包含ProfileCredentialsProvider,只会尝试从环境变量、实例IAM角色等途径获取凭证,而你的SSO凭证仅存在于本地Profile配置和缓存中,因此触发了"No AWS Credentials provided"错误。
内容的提问来源于stack exchange,提问作者Steven St
相关产品推荐
相关产品推荐

