尝试从 Spark 访问 S3 时出现 400 Bad Request

Posted

技术标签:

【中文标题】尝试从 Spark 访问 S3 时出现 400 Bad Request【英文标题】:400 Bad Request while trying to access S3 from Spark 【发布时间】:2018-02-20 07:00:13 【问题描述】:

我正在尝试从 us-east-2(俄亥俄州)的存储桶中通过 s3a 读取文件,但收到 400 Bad Request 响应:

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

由于我的代码与悉尼的另一个存储桶一起使用,这似乎是一个签名 API 版本问题(Ohio 仅支持 4,Sydney 支持 2 和 4)。因此,我尝试按照其他帖子中的建议将其添加到 spark-submit 来设置端点:

--conf "spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com"

但这并没有什么不同。我还尝试将其添加到 conf 文件并使用 --properties-file [file_path] 传递它

spark.hadoop.fs.s3a.endpoint                    s3.us-east-2.amazonaws.com

没有区别。对于俄亥俄州,我仍然遇到同样的错误(由于显而易见的原因,它不再适用于悉尼)。

【问题讨论】:

这是一个 hadoop-aws 问题。为什么去掉了hadoop标签? This answer 可能会有所帮助。看起来您需要显式启用 V4 签名。 我升级到 Hadoop 3.0.0 并且做到了。所以我认为这是一个 Hadoop 错误。 【参考方案1】:

在您的代码中添加以下行:

System.setProperty("com.amazonaws.services.s3.enableV4", "true")

【讨论】:

以上是关于尝试从 Spark 访问 S3 时出现 400 Bad Request的主要内容,如果未能解决你的问题,请参考以下文章

从 S3 将嵌套文本文件读入 spark 时出现内存错误

使用 Spark 访问 s3a 时出现 403 错误

尝试使用 pyspark 从 S3 获取数据时出现空指针异常

尝试从 Jupyter Notebook 使用 Spark 访问 Google Cloud Bigtable 时出现区域错误

从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]

从 Discord API 请求令牌时出现 400 错误