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.
4 Réponses :
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.
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.
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.
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"
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>
Pourriez-vous essayer d'ajouter
sc.hadoopConfiguration.set ("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")