2
votes

Impossible de se connecter de Spark à S3 - Code d'état AmazonS3Exception: 400

J'essaie de me connecter depuis Spark (fonctionnant sur mon PC) à mon compartiment S3:

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

Mais j'obtiens l'exception suivante:

Exception dans le thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Code d'état: 400, Service AWS: Amazon S3, ID de demande AWS: 07A7BDC9135BCC84, erreur AWS Code: null, message d'erreur AWS: demande incorrecte, ID de demande étendue S3: 6ly2vhZ2mAJdQl5UZ / QUdilFFN1hKhRzirw6h441oosGz + PLIvLW2fXsZ9xmd8cuBrNHCdh8UPE =

J'ai vu cette question mais cela ne m'a pas aidé.

Modifier:

Comme Zack l'a suggéré, j'ai ajouté:

 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();

Mais j'obtiens toujours la même exception.


1 commentaires

Pourriez-vous essayer d'ajouter sc.hadoopConfiguration.set ("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")


4 Réponses :


0
votes

Alon,

essayez les configurations ci-dessous:

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();

Je pense que votre problème est dû au fait que vous ne spécifiez pas votre point de terminaison dans l'ensemble de configuration. Sub out us-east-1 pour la région que vous utilisez.


3 commentaires

J'ai ajouté le point de terminaison (dans mon cas, la région est eu-central-1), mais j'obtiens toujours la même exception


@Alon - Avez-vous résolu le problème? pouvez-vous fournir la solution


@LearnHadoop Oui, vous pouvez voir ma réponse acceptée ici.



3
votes

J'ai résolu le problème.

Je ciblais une région (Francfort) qui nécessitait d'utiliser la version 4 de la signature.

J'ai changé la région du compartiment S3 en Irlande et maintenant cela fonctionne.


0 commentaires

1
votes

Selon s3 doc , certaines régions ne supporte que "Signature Version (s) 4", besoin d'ajouter les configurations ci-dessous:

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

et

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


0 commentaires

0
votes

Cela fonctionne pour moi (c'est tout ... aucune autre exportation, etc. n'est nécessaire)

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

pour exécuter:

    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")

p>


0 commentaires