Localement lecture S3 fichiers par Étincelle (ou mieux: pyspark)
Je veux lire un fichier S3 de mon (local) de la machine, par l'intermédiaire de l'Étincelle (pyspark, vraiment). Maintenant, je continue à recevoir des erreurs d'authentification comme
java.lang.IllegalArgumentException: AWS ID de Clé d'Accès et de Secret
La Clé d'accès doit être spécifié en tant que nom d'utilisateur ou mot de passe
(respectivement) d'un s3n URL, ou par la définition de la fs.s3n.awsAccessKeyId
ou fs.s3n.awsSecretAccessKey propriétés (respectivement).
J'ai regardé partout ici et sur le web, essayé beaucoup de choses, mais apparemment S3 a été l'évolution au cours de la dernière année ou mois, et toutes les méthodes ont échoué, mais l'une:
pyspark.SparkContext().textFile("s3n://user:password@bucket/key")
(note de l' s3n
[s3
n'a pas de travail]). Maintenant, je ne veux pas utiliser une URL avec l'utilisateur et le mot de passe parce qu'ils peuvent apparaître dans les journaux, et je suis également pas sûr de la façon de les obtenir à partir de la ~/.aws/credentials
fichier de toute façon.
Alors, comment puis-je lire en local à partir de S3 par Étincelle (ou, mieux, pyspark) en utilisant les informations d'identification AWS à partir de l' standard ~/.aws/credentials
fichier (dans l'idéal, sans copier les informations d'identification, il y à encore un autre fichier de configuration)?
PS: j'ai essayé os.environ["AWS_ACCESS_KEY_ID"] = …
et os.environ["AWS_SECRET_ACCESS_KEY"] = …
, il n'a pas de travail.
PPS: je ne suis pas sûr où "jeu de la fs.s3n.awsAccessKeyId ou fs.s3n.awsSecretAccessKey propriétés" (Google n'est pas venu avec quelque chose). Cependant, j'ai essayé de nombreuses façons de définir ces: SparkContext.setSystemProperty()
, sc.setLocalProperty()
, et conf = SparkConf(); conf.set(…); conf.set(…); sc = SparkContext(conf=conf)
. Rien n'a fonctionné.
- Voir aussi cette réponse.
- Il a travaillé pour moi de définir les variables d'environnement à la ligne de commande avant de l'exécuter étincelle soumettre avec pyspark localement. En les définissant à l'intérieur de pyspark à l'aide de
os.environ
n'ai pas de travail parce qu'il est trop tard pour obtenir ramassé. - Ouais, les choses devraient fonctionner de cette façon (ou par le bon fichier de configuration). Cette question ne se pose qu'en raison d'un bug sur boto.
Vous devez vous connecter pour publier un commentaire.
Oui, vous devez utiliser
s3n
au lieu des3
.s3
est un étrange abus de S3, dont les avantages ne sont pas claires pour moi.Vous pouvez transmettre les informations d'identification de la
sc.hadoopFile
ousc.newAPIHadoopFile
appels:my_file
censé être? Juste un endroit où le fichier de configuration est stocké? Pourrait-il être stocké à l'avance, et au niveau local? Une autre de mes questions était de savoir comment l'accès par programme les données de~/.aws/credentials
(court de l'analyse avecConfigParser
): savez-vous comment faire?my_file
est le fichier que vous tentez de lire. Au lieu de passer les clés dans l'URL, vous les transmettre par le biais de laconf
paramètre. Autant que je sache~/.aws/credentials
est un détail d'implémentation deaws-cli
. Vous pourriez analyser vous-même, ou de mettre les clefs dans votre propre fichier de configuration de votre format préféré. (Je vois qu'il n'est pas une réponse complète. J'espère que c'est utile quand même!)s3n
devrait être utilisé à la place de la "vieille"s3
"bloc" système de fichiers, l'officiel actuel de la documentation indique ques3
doit être utilisé: docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/....s3://
au lieu des3n://
.s3a
au lieu des3n
. Il devrait être l'amélioration de remplacement des3n
de Hadoop 2.6 sur. Je n'ai pas encore essayé, mais appsflyer.com/blog/the-bleeding-edge-spark-parquet-and-s3 décrit des cerceaux vous devez sauter à travers pour qu'il fonctionne.Le problème était en fait un bug dans l'Amazonie
boto
module Python. Le problème était lié au fait que MacPort version est en fait vieux: installationboto
par pip a résolu le problème:~/.aws/credentials
a été lue correctement.Maintenant que j'ai plus d'expérience, je dirais qu'en général (à compter de la fin de 2015) Amazon Web Services, des outils et des Étincelles/PySpark ont une inégale de la documentation et peut avoir de graves bugs qui sont très faciles à exécuter dans. Pour le premier problème, je le recommande à première mise à jour de l'interface de ligne de commande aws,
boto
et Étincelle à chaque fois que quelque chose d'étrange se passe: c'est la "magie" résolu quelques problèmes déjà pour moi.pip install awscli
de nouveau dans un Python 3 contexte. De sorte que la suggestion de toujours garder aws cli, boto d'allumage et de mise à jour est de bon conseil!Voici une solution sur la façon de lire les informations d'identification de
~/.aws/credentials
. Il utilise le fait que les informations d'identification de fichier est un fichier INI qui peut être analysé avec Python configparser.Voir aussi mes gist à https://gist.github.com/asmaier/5768c7cda3620901440a62248614bbd0 .
Les variables d'environnement de l'installation susceptible de l'aider.
Ici, dans l'Étincelle de la FAQ sous la question "Comment puis-je accéder à des données en S3?", ils suggèrent de définir
AWS_ACCESS_KEY_ID
etAWS_SECRET_ACCESS_KEY
variables d'environnement.Je ne peux pas en dire beaucoup sur la java des objets que vous avez à donner à la hadoopFile fonction, seulement que cette fonction semble déjà depricated pour certains "newAPIHadoopFile". La documentation sur ce sujet est assez louche et je pense que vous devez savoir Scala/Java pour vraiment aller au fond de ce tout ce.
Dans le même temps, j'ai compris comment en fait pour obtenir certaines s3 données dans pyspark et j'ai pensé que je voudrais partager mes découvertes.
Cette documentation: Étincelle la documentation de l'API dit qu'il utilise un dict qui est converti en java de configuration (XML). J'ai trouvé la configuration de java, cela doit refléter les valeurs que vous devriez mettre dans le dict: Comment accéder S3/S3n de la locale de l'installation de hadoop
Cet extrait de code charge le fichier sur le seau et le préfixe (chemin d'accès du fichier dans le seau), inscrite sur les deux premières lignes.