尝试访问 AWS Mumbai S3 服务器时出现 301 重定向

Posted

技术标签:

【中文标题】尝试访问 AWS Mumbai S3 服务器时出现 301 重定向【英文标题】:301 redirect when trying to access AWS Mumbai S3 server 【发布时间】:2017-05-31 12:10:00 【问题描述】:

我在亚太地区(孟买)地区创建了一个存储桶,在新加坡地区创建了另一个存储桶。我将键设置为环境变量。然后在 Spark shell 中运行以下命令。

新加坡:

sc.hadoopConfiguration.set("fs.s3a.endpoint","s3-ap-southeast-1.amazonaws.com")
val testdf = sqlContext.read.csv("s3a://dev-singapore/test.csv")

运行良好。

孟买:

sc.hadoopConfiguration.set("fs.s3a.endpoint","s3.ap-south-1.amazonaws.com")
val testdf = sqlContext.read.csv("s3a://dev-mumbai/test.csv")

但它给了我以下错误

17/05/31 11:56:58 WARN DataSource: Error while looking for metadata directory.
com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 301, AWS Service: Amazon S3, AWS Request ID: BDFC*****9C820, AWS Error Code: null, AWS Error Message: Moved Permanently
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232)

孟买地区 S3 服务器仅支持签名版本 4,而新加坡同时支持版本 2 和 4。

我使用了来自 docker 镜像 https://hub.docker.com/r/stvdberghe/spark-s3/ 的 Spark (2.0.0)

【问题讨论】:

【参考方案1】:

301 通常意味着您选择的端点不是存储桶实际所在的端点。

尝试在设置 spark 上下文时设置端点,而不是稍后,在 spark-default.conf 或 sparkConf.set("spark.hadoop.fs.s3a.endpoint", ...)

【讨论】:

但是端点是正确的。我将 aws-java-sdk 更新为 1.7.4,现在它给出了 400。另一个端点和存储桶工作得很好。 hadoop-aws jar 是 2.7 版【参考方案2】:

经过大量的尝试和研究,我可以找出问题所在。让我们重温我的旅程。

Hadoop 2.8 与 Mumbai s3a 一起工作。带有 Hadoop 2.7 的 Spark 2.1.1 无法正常工作。 Spark 依赖于 Hadoop aws 库来连接到 S3。所以,我发现 Hadoop 是罪魁祸首。然后我寻找带有 Hadoop 2.8 发行版的 Spark,但它不可用。我尝试替换 Spark-2.1.1-hadoop-2.7 的 Hadoop 库,但不太合适。 AWS 改变了许多 API,甚至 Hadoop 也改变了客户端库以连接到 S3/AWS 服务。它合并了 hadoop-aws 和 aws-java-sdk;添加了 aws-java-sdk-s3 和更多库。 最后,我使用 Hadoop 2.8 (https://spark.apache.org/docs/2.1.0/building-spark.html#specifying-the-hadoop-version) 构建了 Spark。终于成功了。

虽然我得到了一些 Classnotfound 的错误

org.apache.hadoop.fs.s3a.S3AFileSystem

所以我从 mvn 存储库网站下载了以下内容(因为这里提到了 s3a 依赖项中的 https://hadoop.apache.org/docs/current3/hadoop-aws/tools/hadoop-aws/index.html#Dependencies)

aws-java-sdk-core-1.10.6.jar aws-java-sdk-kms-1.10.6.jar aws-java-sdk-s3-1.10.6.jar hadoop-aws-2.8.0.jar

对于确切的版本,我查看了 Hadoop 2.8 库 ($HADOOP_HOME/share/hadoop/tools/lib/) 文件夹。之后,我上了joda课

org/joda/time/format/DateTimeFormat

我通过从 mvn 存储库网站下载 joda-time-2.8.2 jar 文件解决了未找到错误。

【讨论】:

好的,听起来你已经修好了。我预计 2.7 JAR(特别是 AWS 1.7.4 客户端在 joda 时间更新后可以与孟买一起工作)。您可以尝试将 joda time 更新到 2.8.2 并继续使用 2.7.x JAR。否则:新的 Hadoop 2.8.x 二进制文件将于 2017 年 6 月发布; spark 2.3 有一个构建配置文件“hadoop-cloud”,包括与 AWS、Azure 和 openstack 通信所需的一切 @SteveLoughran 感谢您的洞察力。我拥有的 Spark 发行版已经包含 joda-time-2.9.3.jar。我会检查 hadoop-cloud。 @SteveLoughran 当我编译 Spark 的最新代码时,它没有编译 hadoop-cloud。尝试手动构建它,但给出了缺少配置文件的错误。这里有什么要考虑的吗? 我今天早上使用的 Maven 配置文件:-Pyarn,hadoop-2.7,hadoop-cloud 。如果这不起作用,请在 issues.apache.org 上提交 JIRA 我可以建造它。使用 Hadoop-2.7 时,我仍然遇到连接到版本 4 S3 的问题,但使用 Hadoop-2.8 时一切顺利。很高兴这个配置文件负责每个 jar 安装,否则需要手动完成。

以上是关于尝试访问 AWS Mumbai S3 服务器时出现 301 重定向的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 aws ec2 客户端访问存储桶时出现位置约束异常

从 Nuxt 上传到 AWS S3 存储桶时出现 500 内部服务器错误

在 Geoserver 和 S3 AWS 之间建立连接时出现问题

尝试将 AWS S3 数据库备份到 heroku postgres 时出现 403 错误

创建 SageMaker 模型时出现 ValidationError

运行 Amazon S3 示例时出现 Amazon AWS 403 InvalidAccesskey 错误