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

Spark-Redshift 3.0.0与Spark-2.2.0在V4/孟买/法兰克福区域使用报错求助

解决Spark-Redshift 3.0.0 + Spark 2.2.0读取Redshift时的S3授权错误

这个错误的核心原因很明确:你使用的S3存储桶所在区域只支持AWS4-HMAC-SHA256签名算法,但你的Spark环境默认用了旧的签名方式(比如AWS2),导致S3拒绝请求。下面是一步步的解决方案:

1. 先确认S3桶的区域

首先检查你的临时S3桶(就是Spark-Redshift用来存UNLOAD数据的那个桶)所在区域——除了最早的us-east-1,大部分S3新区域(比如ap-southeast-1、eu-west-1等)都强制要求AWS4签名。你可以在AWS控制台的S3桶详情里找到区域信息。

2. 配置Spark的S3签名和Endpoint

在读取Redshift数据的代码里,添加以下关键配置,强制使用AWS4签名并指定对应区域的S3 Endpoint:

val redshiftDF = spark.read
  .format("com.databricks.spark.redshift")
  .option("url", "jdbc:redshift://your-redshift-endpoint:5439/your-db?user=your-user&password=your-pass")
  .option("query", "SELECT * FROM your-target-table")
  .option("tempdir", "s3a://your-temp-bucket/path/to/temp/") // 注意用s3a协议
  // 核心配置:开启AWS4签名
  .option("fs.s3a.signature.version", "AWS4-HMAC-SHA256")
  // 替换成你的S3桶所在区域的Endpoint,比如新加坡区是s3-ap-southeast-1.amazonaws.com
  .option("fs.s3a.endpoint", "s3-your-region.amazonaws.com")
  .load()

如果是用Spark SQL的方式,也可以在SparkSession初始化时全局配置:

val spark = SparkSession.builder()
  .appName("RedshiftReader")
  .config("fs.s3a.signature.version", "AWS4-HMAC-SHA256")
  .config("fs.s3a.endpoint", "s3-your-region.amazonaws.com")
  .getOrCreate()

3. 升级依赖解决SDK兼容性问题

Spark 2.2.0默认依赖的AWS SDK和Hadoop-AWS版本比较老,可能对AWS4签名的支持不完善。你需要确保以下依赖的版本足够新:

  • aws-java-sdk-s3:建议用1.11.x系列(比如1.11.375,这个版本对AWS4支持稳定)
  • hadoop-aws:建议用2.7.3或更高(和Spark 2.2.0的Hadoop版本兼容)

如果是用sbt构建项目,添加这些依赖:

libraryDependencies ++= Seq(
  "com.amazonaws" % "aws-java-sdk-s3" % "1.11.375" % Provided,
  "org.apache.hadoop" % "hadoop-aws" % "2.7.3" % Provided
)

如果是用spark-submit提交任务,直接通过--jars参数引入这些依赖包(注意要下载对应的jar包,或者用maven坐标通过--packages):

spark-submit \
  --packages com.amazonaws:aws-java-sdk-s3:1.11.375,org.apache.hadoop:hadoop-aws:2.7.3 \
  --class your.main.Class \
  your-app.jar

4. 检查Redshift UNLOAD的区域配置

Spark-Redshift是通过Redshift的UNLOAD命令把数据导出到S3临时桶,再由Spark读取的。如果Redshift集群和S3桶不在同一个区域,需要在UNLOAD时指定区域参数。你可以通过Spark-Redshift的unload_s3_format选项来设置:

.option("unload_s3_format", "FORMAT AS PARQUET REGION 'your-s3-region'")

这样Redshift在UNLOAD时会用正确的区域访问S3,避免签名问题。

5. 验证AWS凭证权限

最后确认你的AWS凭证(access key/secret key)有S3临时桶的读写权限,并且配置正确。你可以通过以下方式配置:

  • 在Spark配置里直接设置:spark.hadoop.fs.s3a.access.key和spark.hadoop.fs.s3a.secret.key
  • 通过环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
  • 如果是在EMR集群上运行,确保集群的IAM角色有S3访问权限

按照以上步骤操作,基本就能解决这个授权错误了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:04