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

使用PySpark写入带KMS加密的S3桶时遇Signature Version 4错误求助

解决PySpark写入KMS加密S3桶的Signature Version 4错误

这个错误的核心原因很明确:启用了KMS服务器端加密的S3桶强制要求所有请求使用AWS Signature Version 4签名,但你的当前配置没有开启这个签名方式,或者依赖版本不支持默认启用它。

下面是一步步的解决办法:

1. 先添加必要的Hadoop配置参数

在你的PySpark代码中,向Hadoop配置里添加以下参数,强制S3A客户端使用Signature V4,并指定你的S3桶所在的AWS区域:

spark_context = SparkContext()
sql_context = SQLContext(spark_context)
spark = SparkSession.builder.appName('abc').getOrCreate()

hadoopConf = spark_context._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
# 添加以下两行配置,开启SIGV4签名并指定区域
hadoopConf.set("fs.s3a.signing-algorithm", "SIGV4")
# 替换成你的S3桶实际所在区域,比如us-east-1、eu-west-1等
hadoopConf.set("fs.s3a.endpoint", "s3.us-east-1.amazonaws.com")

# 后续写入代码保持不变
source_data.coalesce(1).write.mode('overwrite').parquet("s3a://sample-bucket")

2. 检查并升级依赖版本(推荐)

你当前使用的hadoop-aws:2.7.2和aws-java-sdk-pom:1.10.34版本组合比较老旧,还存在兼容性问题:hadoop-aws 2.x系列和高版本的aws-java-sdk可能会出现冲突,同时2.7.x版本的hadoop-aws默认并没有强制启用Signature V4。

推荐升级到更稳定的版本组合,比如:

  • hadoop-aws:2.8.5(或更高的2.x稳定版本)
  • 对应的aws-java-sdk:1.11.x系列(和hadoop-aws版本匹配)

修改后的spark-submit命令示例:

spark-submit --packages org.apache.hadoop:hadoop-aws:2.8.5,com.amazonaws:aws-java-sdk:1.11.800 --jars sample-jar sample_pyspark.py

升级后,新版本的hadoop-aws会更智能地处理S3签名,甚至可能不需要手动指定signing-algorithm参数,同时也能避免很多旧版本的兼容性bug。

为什么未加密桶可以正常写入?

未启用KMS加密的S3桶通常允许使用旧的Signature Version 2签名,所以你的旧配置可以正常工作;但KMS加密的桶出于安全考虑,强制要求使用更安全的Signature Version 4,因此触发了这个错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:57:30