1
votes

aws accède à s3 à partir de spark en utilisant le rôle IAM

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 commentaires

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?


3 Réponses :


1
votes

"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

  • votre rôle IAM ne dispose pas des autorisations pour s3: ListBucket. Voir IAM autorisations de rôle pour travailler avec s3a
  • le nom de votre bucket est incorrect
  • Certains paramètres dans fs.s3a ou dans les variables AWS_ env ont la priorité sur le rôle IAM, et ils sont erroné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.

  1. Regardez ce qui est défini dans fs.s3a.aws.credentials.provider -il doit être annulé ou contenir l'option com.amazonaws.auth.InstanceProfileCredentialsProvider
  2. en supposant que vous avez également 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


2 commentaires

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+



4
votes

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  


2 commentaires

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



0
votes
  • étape 1. pour configurer le framework de conteneur Spark comme Yarn core-site.xml, puis redémarrez Yarn
  • 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

    • étape2. Spark Shell à tester comme suit.

    val rdd=sc.textFile("s3a://path/file")
     rdd.count()
     rdd.take(10).foreach(println)

    Cela fonctionne pour moi


0 commentaires