SageMaker Studio本地模式PySpark连接S3凭证配置问题
原因说明:无参数初始化boto3可正常访问S3的逻辑
SageMaker Studio运行环境默认绑定了预置权限的执行角色,boto3内置默认凭证提供链,会按固定优先级自动从多个位置加载完整鉴权信息:
- 读取进程环境变量中
AWS_前缀的凭证参数 - 读取用户目录下
~/.aws/credentials、~/.aws/config的配置内容 - 调用SageMaker环境内置的元数据服务接口,获取当前执行角色对应的临时会话凭证
SageMaker环境中分配的角色凭证属于临时凭证,鉴权必须同时携带access_key、secret_key、session_token三个参数。之前手动调用session.get_credentials()后仅提取了前两个字段,遗漏了必填的会话令牌,因此无论传给boto3客户端还是PySpark的S3A配置,都会因鉴权参数不全被服务拒绝。无参数初始化boto3客户端时,SDK会自动加载完整的三个鉴权参数,因此可以正常访问S3。
PySpark连接S3的配置方法
有两种可行方案,第二种无需手动管理凭证,稳定性更高。
方案1:手动提取完整凭证配置
- 提取完整的临时凭证,使用
get_frozen_credentials()获取固定的有效凭证集合,避免凭证自动刷新导致的参数不一致问题:import boto3 session = boto3.Session() credentials = session.get_credentials().get_frozen_credentials() access_key = credentials.access_key secret_key = credentials.secret_key session_token = credentials.token - 初始化SparkSession时补全S3A文件系统的必填配置,除密钥外还要指定会话令牌和临时凭证提供者类,否则S3A连接器不会识别会话令牌参数:
import sagemaker_pyspark from pyspark.sql import SparkSession classpath = ":".join(sagemaker_pyspark.classpath_jars()) spark = SparkSession.builder \ .config("spark.driver.extraClassPath", classpath) \ .config("fs.s3a.access.key", access_key) \ .config("fs.s3a.secret.key", secret_key) \ .config("fs.s3a.session.token", session_token) \ .config("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider") \ .getOrCreate() - 配置完成后可通过读取S3路径验证连通性:
# 替换为实际可访问的S3文件路径 test_df = spark.read.csv("s3a://target-bucket/test.csv") test_df.show()
方案2:使用默认凭证链自动加载(推荐)
不需要手动提取、传递任何凭证参数,直接配置S3A连接器使用和boto3一致的默认凭证提供链即可,连接器会自动完成凭证加载、过期刷新的全流程,不存在参数遗漏、凭证过期失效的问题:
import sagemaker_pyspark from pyspark.sql import SparkSession classpath = ":".join(sagemaker_pyspark.classpath_jars()) spark = SparkSession.builder \ .config("spark.driver.extraClassPath", classpath) \ .config("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.DefaultAWSCredentialsProviderChain") \ .getOrCreate()
该方案是SageMaker Studio本地模式运行PySpark作业连接S3的标准实践。
内容的提问来源于stack exchange,提问作者Gaurav Chauhan
相关产品推荐
相关产品推荐

