1

PROBLÈME: Je souhaite enregistrer dans des compartiments AWS S3 à partir du cluster d'Amazon sans avoir à authentifier ou à utiliser des bibliothèques. Fondamentalement, je veux enregistrer des données à partir d'un programme s'exécutant sur les clusters Amazon dans un compartiment S3. Je cours quelques programmes Python3 dans le cluster EMR Amazon Web Service (AWS) et j'essaie d'enregistrer des fichiers dans un dossier dans un compartiment AWS S3, et si ce dossier n'existe pas, je veux le créer.Enregistrement d'un fichier sur Amazon Web Service s3

La façon dont je sauvegarde le fichier est quelque chose comme ci-dessous. J'ai essayé la méthode with et cela ne fonctionne pas non plus.

output = open("s3://mybucket/myfile.txt", "w+") 
output.write("hello world\n") 

Pour une raison quelconque, l'enregistrement d'une RDD comme part-xxxxx fichiers à un seau S3 fonctionne en utilisant la méthode de RDD Spark sans fournir l'authentification:

rdd.saveAsTextFile("s3://mybucket/") 

Est-ce que le travail saveAsTextFile() sans authentification ou faut-il authentifie en quelque sorte en arrière-plan?

Si elle ne nécessite pas d'authentification pour enregistrer des fichiers sur des seaux S3 de grappes d'Amazon, est-il un moyen de le faire en utilisant la méthode open de Python sans nécessiter l'authentification comme la façon dont saveAsTextFile() méthode RDD il fait?

Répondre

1

Si vous utilisez DME vous ne probablement pas besoin de quoi que ce soit explicite pour fournir une authentification Les machines créées. dans le cluster DME sont par défaut attribué rôles IAM (créé avec votre premier groupe DME) qui devrait inclure

la permission de lire et écrire sur S3. les rôles IAM travail en donnant des autorisations pour utiliser différentes API AWS des machines spécifiques par opposition à un compte utilisateur AWS spécifique. étant envoyé à partir de cette boîte, vous n'aurez pas besoin de fournir des clés d'authentification utilisateur.

Il y a deux options dans votre code d'étincelle pour enregistrer des données sur S3:

1) Utiliser des API propres d'écriture de Spark pour RDD et DataFrames (RDD.saveAsTextFile et DataFrame.write). Ceux-ci fonctionneront pour S3, HDFS ou les chemins de système de fichiers locaux en supposant que toutes les bonnes bibliothèques sont installées. Ce qu'ils seront sur EMR. L'utilisation de cette méthode entraînera l'écriture des fichiers _SUCCESS et ##### normaux, mais vous pouvez utiliser la méthode coalesce (1) de Spark pour la limiter à un fichier de partition.

2) Utilisez la bibliothèque AWS SDK pour écrire manuellement des fichiers sur S3.

J'ai tendance à utiliser l'option # 1 car elle supportera facilement différents systèmes de fichiers de destination sans aucune modification de mon code. De même, vous n'avez pas à vous soucier des bibliothèques supplémentaires.

Une autre note, si vous utilisez EMR, "s3: //" est le préfixe correct pour tous les points d'extrémité S3, pas s3n ou s3a.

0

Vous ne savez pas comment vous avez réussi à télécharger des fichiers .part sur s3 sans authentification, même si vous avez modifié les stratégies s3. Je suppose que vous avez peut-être ajouté des clés aws dans l'environnement système en tant que propriétés ou fichiers conf. Afin d'accéder à la ressource aws, au moins son nécessaire pour fournir la clé d'accès et la clé secrète. En outre, le schéma s3 est maintenant déprécié. Le code suivant fonctionne avec hadoop-aws-2.8.0.jar et spark 2.1. (note:. Je devrais avoir utilisé schéma S3A comme le préféré sur S3N (schéma natif)

val spark = SparkSession 
       .builder 
       .appName("SparkS3Integration") 
       .master("local[*]") 
       .getOrCreate() 
      spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", awsAccessKey) 
      spark.sparkContext.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", awsSecretKey) 

val rdd = spark.sparkContext.parallelize(Seq(1,2,3,4)) 
rdd.saveAsTextFile("s3n://<bucket_name>/<path>") 
+0

s3n (système de fichiers s3 natif) est maintenant obsolète, à sa place s3a doit être utilisé. Dans Spark 2.0, les propriétés suivantes doivent être configurées pour utiliser s3a 1. fs.s3a.access.key 2. fs.s3a.secret.key 3. org.apache.hadoop.fs.s3a.S3AFileSystem –