无法从spark连接到s3-AmazonS3异常状态代码:400

bis0qfac  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(529)

我正在尝试从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错误代码:null,aws错误消息:错误请求,s3扩展请求id:6ly2vhz2majdql5uz/qudiffn1hkhrzirw6h441oosgz+plivlw2fxsz9xmd8cubrnhcdh8upe=
我见过这个问题,但对我没有帮助。
编辑:
正如扎克建议的那样,我补充说:

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

但我还是得到了同样的例外。

cfh9epnr

cfh9epnr1#

根据s3文档,部分地区仅支持“签名版本4”,需要增加以下配置:

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

以及

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

tp5buhyn2#

这对我来说很有用(这就是一切…不需要其他出口等)

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
x8diyxa7

x8diyxa73#

阿隆,
请尝试以下配置:

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 无论你使用哪个地区。

iugsix8n

iugsix8n4#

我已经解决了这个问题。
我的目标是一个地区(法兰克福),需要使用第4版的签名。
我把s3桶的区域改成了爱尔兰,现在它开始工作了。

相关问题