首页 > 解决方案 > 尝试使用 spark 读取位于 ap-east-1 区域的存储桶中的数据存储时出现错误 400

问题描述

我有一堆代码用于从/向 S3 存储桶读取/写入数据。

在新的 AWS 区域(最初部署在 eu-west-1,新部署发生在 ap-east-1 区域)上复制此代码后。我有以下错误:

com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: SOMEID, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID: SOMEREQUESTID

经过调查,以下行从 S3AFileSystem.java 抛出错误

if (!s3.doesBucketExist(bucket)) {

这里,对存储桶执行 HEAD 操作。经过调查,似乎端点始终是https://s3.amazonaws.com并且头请求在https://bucket-name.s3.amazonaws.com上触发,而它应该发生在https://bucket- name.s3.ap-east-1.amazonaws.com(也是,fs.s3a.path.style.accessfalse

使用环境变量指定区域AWS_DEFAULT_REGION不会修改行为。

最后的信息,这是我在 build.sbt 中定义的依赖项

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.2.0"
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.0"
libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "2.7.3"

不用说,只要我在 eu-west-1 配置中指向我的存储桶,代码就可以工作。我应该做什么(在我的代码或我的存储桶配置上)以允许我的代码加载文件。

为了记录,代码是

getSparkSession().read.format("csv").option("delimiter", ";").option("header","false").load(path)

标签: scalaamazon-web-servicesapache-sparkhadoopamazon-s3

解决方案


推荐阅读