尝试从 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的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 pyspark 从 S3 获取数据时出现空指针异常
尝试从 Jupyter Notebook 使用 Spark 访问 Google Cloud Bigtable 时出现区域错误