【问题标题】:Can't connect from Spark to S3 - AmazonS3Exception Status Code: 400无法从 Spark 连接到 S3 - AmazonS3Exception 状态代码:400
【发布时间】:2019-11-24 11:51:40
【问题描述】:

我正在尝试从 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 错误 代码:空,AWS 错误消息:错误请求,S3 扩展请求 ID: 6ly2vhZ2mAJdQl5UZ/QUdilFFN1hKhRzirw6h441oosGz+PLIvLW2fXsZ9xmd8cuBrNHCdh8UPE=

我见过this question,但对我没有帮助。

编辑:

按照 Zack 的建议,我补充说:

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

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

【问题讨论】:

  • 您可以尝试添加sc.hadoopConfiguration.set("fs.s3a.impl " , "org.apache.hadoop.fs.s3a.S3AFileSystem")

标签: scala amazon-web-services apache-spark hadoop amazon-s3


【解决方案1】:

我已经解决了问题。

我的目标是需要使用第 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"
    

    【讨论】:

      【解决方案3】:

      阿隆,

      尝试以下配置:

      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

      【讨论】:

      • 我已经添加了端点(在我的例子中,该区域是 eu-central-1),但我仍然遇到同样的异常
      • @Alon - 你解决了这个问题吗?你能提供解决方案吗
      • @LearnHadoop 是的,我有,你可以在这里看到我接受的答案。
      【解决方案4】:

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

          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
      

      【讨论】:

        猜你喜欢
        • 2021-09-04
        • 2018-06-01
        • 2020-06-21
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 2016-04-25
        • 2022-10-19
        • 1970-01-01
        相关资源
        最近更新 更多