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

PySpark配置S3A使用AWS SDK v2凭证链报错求助

问题:PySpark中使用AWS SDK Java v2凭证链连接S3a失败

背景

我在PySpark里一直用这段代码配置SparkSession:

spark_session = (SparkSession
                  .builder
                  .appName(f"ditto-lander-spark-ingest-etl-{args['etl_job_name']}")
                  .config("spark.hadoop.fs.s3a.aws.credentials.provider",
                          "com.amazonaws.auth.DefaultAWSCredentialsProviderChain")
                  .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
                  .getOrCreate())

但收到警告:

"AWS SDK for Java 1.x已于2024年7月31日进入维护模式,并将于2025年12月31日停止支持"

为了切换到AWS SDK Java v2,我把凭证提供者改成了v2的类:

.config("spark.hadoop.fs.s3a.aws.credentials.provider", 
"software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider")

结果直接报错:

java.io.IOException: Class class software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider does not implement AWSCredentialsProvider

当前用的aws-sdk-java版本是2.29.25,想在PySpark的fs.s3a里正常用上AWS SDK v2的凭证链。

解决方案

问题核心是:原来的org.apache.hadoop.fs.s3a.S3AFileSystem是基于AWS SDK Java 1.x开发的,它要求凭证提供者必须实现1.x的com.amazonaws.auth.AWSCredentialsProvider接口,而v2的DefaultCredentialsProvider属于全新的v2体系,和1.x的接口不兼容,直接替换肯定报错。

要用上v2的凭证链,得按以下步骤调整:

1. 升级Hadoop版本到支持v2的版本

必须用Hadoop 3.3.5及以上版本——这个版本开始官方推出了适配AWS SDK v2的S3A客户端。同时要确保引入对应的依赖:

  • hadoop-aws 3.3.5+
  • aws-sdk-java-v2-bundle 与hadoop-aws匹配的版本(具体对应关系可查Hadoop官方文档)

2. 切换到v2版本的S3A客户端实现

把fs.s3a.impl的配置改成v2的实现类:

.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystemV2")

3. 指定v2的凭证提供者类

此时就可以正常使用v2的凭证链类了:

.config("spark.hadoop.fs.s3a.aws.credentials.provider",
        "software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider")

完整配置示例

spark_session = (SparkSession
                  .builder
                  .appName(f"ditto-lander-spark-ingest-etl-{args['etl_job_name']}")
                  .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystemV2")
                  .config("spark.hadoop.fs.s3a.aws.credentials.provider",
                          "software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider")
                  .getOrCreate())

额外注意事项

  • 如果是集群运行,要保证所有节点的Hadoop依赖都更新到对应版本,避免出现依赖冲突。
  • 用Spark submit提交任务时,可以通过--packages参数直接引入所需依赖:
spark-submit --packages org.apache.hadoop:hadoop-aws:3.3.5,software.amazon.awssdk:aws-sdk-java-v2-bundle:2.20.146 your_script.py

(版本号请根据实际兼容情况调整)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:33:26