无法从 Spark 连接到 S3 - AmazonS3Exception 状态代码:400

问题描述 投票:0回答:5

我正在尝试从 Spark(在我的 PC 上运行)连接到我的 S3 存储桶:

 val spark = SparkSession
      .builder
      .appName("S3Client")
      .config("spark.master", "local")
      .getOrCreate()

val sc = spark.sparkContext;
    sc.hadoopConfiguration.set("fs.s3a.access.key", ACCESS_KEY)
    sc.hadoopConfiguration.set("fs.s3a.secret.key", SECRET_KEY)
    val txtFile = sc.textFile("s3a://bucket-name/folder/file.txt")
    val contents = txtFile.collect();

但出现以下异常:

线程“main”中的异常 com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:400, AWS 服务:Amazon S3,AWS 请求 ID:07A7BDC9135BCC84,AWS 错误 代码:null,AWS 错误消息:错误请求,S3 扩展请求 ID: 6ly2vhZ2mAJdQl5UZ/QUdilFFN1hKhRzirw6h441oosGz+PLIvLW2fXsZ9xmd8cuBrNHCdh8UPE=

我看过这个问题,但它对我没有帮助。

编辑:

按照扎克的建议,我补充道:

sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.eu-central-1.amazonaws.com")

但我仍然遇到同样的异常。

scala amazon-web-services apache-spark hadoop amazon-s3
5个回答
3
投票

我已经解决了问题。

我的目标是需要使用签名版本 4 的地区(法兰克福)。

我已将 S3 存储桶的区域更改为爱尔兰,现在它可以正常工作了。


2
投票

根据s3 doc,部分地区仅支持“Signature Version(s) 4”,需要添加以下配置:

--conf "spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"

--conf "spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"

0
投票

阿隆,

尝试以下配置:

val spark = SparkSession
      .builder
      .appName("S3Client")
      .config("spark.master", "local")
      .getOrCreate()

val sc = spark.sparkContext;
    sc.hadoopConfiguration.set("fs.s3a.access.key", ACCESS_KEY)
    sc.hadoopConfiguration.set("fs.s3a.secret.key", SECRET_KEY)
    sc.hadoopConfiguration.set("fs.s3a.endpoint", "s3.us-east-1.amazonaws.com")
    val txtFile = sc.textFile("s3a://s3a://bucket-name/folder/file.txt")
    val contents = txtFile.collect();

我相信您的问题是由于您没有在配置集中指定端点造成的。将

us-east-1
替换为您使用的任何区域。


0
投票

这对我有用(这就是一切......不需要其他导出等)

    sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", AWS_KEY)
    sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_SECRET)
    sparkContext._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.us-east-2.amazonaws.com")

运行:

spark-submit --conf spark.driver.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' --conf spark.executor.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4'   --packages org.apache.hadoop:hadoop-aws:2.7.1  spark_read_s3.py

0
投票

就我而言。正如我所拥有的那样

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

我还必须使用“s3a:”而不是“s3”来启动 s3 路径

© www.soinside.com 2019 - 2024. All rights reserved.