无法从Spark连接到S3-AmazonS3Exception状态代码:400

时间:2019-07-15 18:40:43

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

我正在尝试从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();

但是出现以下异常:

  

线程“主”中的异常   com.amazonaws.services.s3.model.AmazonS3Exception:状态码:400,   AWS服务:Amazon S3,AWS请求ID:07A7BDC9135BCC84,AWS错误   代码:null,AWS错误消息:错误的请求,S3扩展请求ID:   6ly2vhZ2mAJdQl5UZ / QUdilFFN1hKhRzirw6h441oosGz + PLIvLW2fXsZ9xmd8cuBrNHCdh8UPE =

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

编辑:

如Zack所建议,我添加了:

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

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

4 个答案:

答案 0 :(得分:1)

根据s3 doc,某些区域仅支持“签名版本4”,需要添加以下配置:

--conf "spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"

--conf "spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true"

答案 1 :(得分:0)

Alon,

尝试以下配置:

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细分为您使用的任何区域。

答案 2 :(得分:0)

我已经解决了问题。

我定位的区域(法兰克福)需要使用签名的第4版。

我已将S3存储桶的区域更改为爱尔兰,现在可以正常使用了。

答案 3 :(得分:0)

这对我有用(这就是所有...不需要其他出口等)

    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