Je veux accéder à s3 depuis spark, je ne veux pas configurer de clé secrète et d'accès, je veux y accéder en configurant le rôle IAM, j'ai donc suivi les étapes données dans s3-spark
Mais cela ne fonctionne toujours pas à partir de mon instance EC2 ( qui exécute spark autonome)
cela fonctionne quand j'ai testé
19/01/16 18:23:06 WARN FileStreamSink: Error while looking for metadata directory. com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: E295957C21AFAC37, AWS Error Code: null, AWS Error Message: Bad Request at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:798) at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:421) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:232) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3528) at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.java:1031) at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.java:994) at org.apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.java:297) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) at org.apache.spark.sql.execution.datasources.DataSource$.org$apache$spark$sql$execution$datasources$DataSource$$checkAndGlobPathIfNecessary(DataSource.scala:616)
mais cela n'a pas fonctionné quand j'ai essayé comme ci-dessous
scala> val df = spark.read.json("s3a://testmys3/*")
J'obtiens l'erreur ci-dessous
[ec2-user@ip-172-31-17-146 bin]$ aws s3 ls s3://testmys3/ 2019-01-16 17:32:38 130 e.json
3 Réponses :
"400 Bad Request" est assez inutile, et non seulement S3 ne fournit pas grand-chose, mais le connecteur S3A n'imprime pas non plus beaucoup de date liée à l'authentification. Il y a une grande section sur dépanner l'erreur
Le fait qu'il soit arrivé à faire une demande signifie qu'il a des informations d'identification, seule l'extrémité distante ne les aime pas
Possibilités
Vous devriez avoir automatiquement l'authentification IAM comme mécanisme d'authentification avec le connecteur S3A; c'est celui qui est vérifié en dernier après: config & env vars.
fs.s3a.aws.credentials.provider
-il doit être annulé ou contenir l'option com.amazonaws.auth.InstanceProfileCredentialsProvider
hadoop
sur la ligne de commande, saisissez storediag a> hadoop jar cloudstore-0.1-SNAPSHOT.jar storediag s3a://testmys3/
il devrait vider ce qu'il fait concernant l'authentification.
Mise à jour
Comme le L'affiche d'origine a commenté, cela était dû à l'authentification v4 requise sur le point de terminaison S3 spécifique. Cela peut être activé sur la version 2.7.x du client s3a, mais uniquement via les propriétés système Java. Pour 2.8+, il y a quelques fs.s3a. options que vous pouvez définir à la place
merci, cela a fonctionné avec la configuration ci-dessous $. / spark-shell --packages com.amazonaws: aws-java-sdk: 1.7.4, org.apache.hadoop: hadoop-aw s: 2.7.3 --conf spark. hadoop.fs.s3a.endpoint = s3.us-east-2.amazonaws.com --conf spark.hadoop.fs.s3a.impl = org.apache.hadoop.fs.s3a.S3AFileSys tem --conf spark. hadoop.fs.s3a.aws.credentials.provider = com.amazonaws.a uth.InstanceProfileC redentialsProvider --conf spark.executor.extraJavaOptions = -Dcom.amazonaws.services.s3. enableV4 = true --conf spark .driver.extraJavaOptions = -Dcom.amazonaws.services.s3.en ableV4 = true
Je comprends. Point de terminaison V4 comme Francfort, Londres, Corée. Comme vous l'avez constaté, cela demande des efforts dans la version 2.7.x hadoop pour ce faire. Il y a un support explicite dans la version 2.8+
cette configuration a fonctionné
./spark-shell \ --packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3 \ --conf spark.hadoop.fs.s3a.endpoint=s3.us-east-2.amazonaws.com \ spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.InstanceProfileCredentialsProvider \ --conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true \ --conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true
Merci, cela m'a aidé. Petite note: j'ai pu faire fonctionner cela avec un compartiment S3 chiffré par KMS en utilisant les packages AWS de Hadoop 2.9.2: aws-java-sdk-bundle-1.11.199.jar et hadoop-aws-2.9.2 .pot
Merci, cela a fonctionné. J'ai apporté quelques modifications ici lien
fs.s3a.aws.credentials.provider-- com.cloudera.com.amazonaws.auth.InstanceProfileCredentialsProvider
fs.s3a.endpoint-- s3-ap-northeast-2.amazonaws.com
fs.s3.impl-- org.apache.hadoop.fs.s3a.S3AFileSystem
val rdd=sc.textFile("s3a://path/file") rdd.count() rdd.take(10).foreach(println)
Cela fonctionne pour moi
Je n'ai aucune expertise en spark mais que se passe-t-il si vous spécifiez le fichier lui-même comme s3a: //testmys3/e.json
Pourquoi n'utilisez-vous pas le DME pour cela?
@Thiago: peut-être qu'il n'utilise pas EMR parce qu'il ne veut pas de sa propre version de Spark, pas de la fourchette de source fermée proposée par l'équipe EMR, ou d'utiliser une version Spark fournie par l'ASF ou quelqu'un d'autre. Ou il veut utiliser le connecteur S3A qui est maintenant en avance sur le connecteur s3 à source fermée d'EMR et est livré avec stackoverflow et prise en charge d'Apache JIRA?