PySpark配置S3A使用AWS SDK v2凭证链报错求助
背景
我在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-aws3.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

