2015-04-04 14 views
16

Ich möchte eine S3-Datei von meinem (lokalen) Rechner über Spark (wirklich pyspark) lesen. Nun, ich erhalte immer Authentifizierungsfehler wieLokales Lesen von S3-Dateien über Spark (oder besser: pyspark)

java.lang.IllegalArgumentException: AWS Access Key ID und Geheim Access Key muss als Benutzername oder Passwort (jeweils) eine S3N URL angegeben werden, oder durch die Einstellung fs.s3n.awsAccessKeyId oder fs.s3n.awsSecretAccessKey-Eigenschaften (jeweils).

sah ich überall hier und im Web, versuchten viele Dinge, aber anscheinend S3 im letzten Jahr oder Monate hat sich verändert, und alle Methoden versagt aber ein:

pyspark.SparkContext().textFile("s3n://user:[email protected]/key") 

(beachten Sie die s3n [s3 hat nicht funktioniert]). Jetzt möchte ich keine URL mit dem Benutzer und dem Passwort verwenden, da sie in den Protokollen erscheinen können, und ich bin mir auch nicht sicher, wie ich sie aus der Datei ~/.aws/credentials bekommen kann.

Also, wie kann ich lokal von S3 durch Spark (oder besser, pyspark) mit den AWS-Anmeldeinformationen von der jetzt standard~/.aws/credentials Datei lesen (idealerweise ohne die Anmeldeinformationen dort in eine andere Konfigurationsdatei zu kopieren)?

PS: Ich habe versucht, os.environ["AWS_ACCESS_KEY_ID"] = … und os.environ["AWS_SECRET_ACCESS_KEY"] = …, es hat nicht funktioniert.

PPS: Ich bin mir nicht sicher, wo ich die Eigenschaften "fs.s3n.awsAccessKeyId" oder "fs.s3n.awsSecretAccessKey" festlegen soll (Google hat sich nichts ausgedacht). Ich habe jedoch viele Möglichkeiten versucht, diese zu setzen: SparkContext.setSystemProperty(), sc.setLocalProperty() und conf = SparkConf(); conf.set(…); conf.set(…); sc = SparkContext(conf=conf). Nichts hat geklappt.

+0

Siehe auch [diese Antwort] (http://stackoverflow.com/a/33787125/1243926). – osa

Antwort

1

Das Problem war eigentlich ein Fehler im Amazonas boto Python-Modul. Das Problem hing mit der Tatsache zusammen, dass die Version von MacPort eigentlich alt ist: Die Installation von boto über Pip löste das Problem: ~/.aws/credentials wurde korrekt gelesen.

Jetzt, da ich mehr Erfahrung habe, würde ich sagen, dass im Allgemeinen (ab Ende 2015) Amazon Web Services Tools und Spark/PySpark eine lückenhafte Dokumentation haben und einige schwerwiegende Fehler haben, die sehr einfach sind . Für das erste Problem würde ich empfehlen, ersten update die AWS Kommandozeilenschnittstelle, boto und Spark jedes Mal etwas seltsames passiert: das hat "magisch" ein paar Probleme bereits für mich gelöst.

+0

Ich habe Python 3.6 installiert und awscli zerstört. Ich glaube, ich habe es ursprünglich mit 2.7 installiert und musste dann in einem Python 3-Kontext wieder 'pip install awscli' installieren. Dieser Vorschlag, aws cli, boto und spark immer auf dem neuesten Stand zu halten, ist ein guter Rat! – Davos

4

Ja, Sie müssen s3n anstelle von s3 verwenden. s3 ist ein seltsamer Missbrauch von S3, dessen Vorteile mir unklar sind.

Sie können die Anmeldeinformationen an den sc.hadoopFile oder sc.newAPIHadoopFile Anrufe passieren:

rdd = sc.hadoopFile('s3n://my_bucket/my_file', conf = { 
    'fs.s3n.awsAccessKeyId': '...', 
    'fs.s3n.awsSecretAccessKey': '...', 
}) 
+0

Danke, das ist informativ. Was soll dieses 'my_file' sein? Nur ein Ort, wo die Konfigurationsdatei gespeichert ist? Könnte es vorher und dann lokal gespeichert werden? Eine weitere meiner Fragen war, wie man programmatisch auf die Daten von '~/.aws/credentials' (kurz mit' ConfigParser' geparkt) zugreifen kann: Weißt du wie das geht? – EOL

+2

'my_file' ist die Datei, die Sie lesen möchten. Anstatt die Schlüssel in der URL zu übergeben, übergeben Sie sie über den Parameter 'conf'. Soweit ich weiß '~/.aws/credentials' ist ein Implementierungsdetail von' aws-cli'. Sie könnten es selbst analysieren oder die Schlüssel in Ihre eigene Konfigurationsdatei Ihres bevorzugten Formats legen. (Ich sehe, es ist keine vollständige Antwort. Hoffe, es ist sowieso nützlich!) –

+0

Als Referenz: Während ich in der Tat wiederholt gesehen habe, sollte 's3n' anstelle des" alten "' s3' "block" Dateisystems verwendet werden, der aktuelle Beamte Dokumentation besagt, dass 's3' verwendet werden sollte: http://docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/emr-plan-file-systems.html. – EOL

0

kann ich nicht viel sagen über die Java-Objekte, die Sie auf die hadoopFile Funktion geben, nur, dass diese Funktion für einige scheint bereits depricated " newAPIHadoopFile ". Die Dokumentation dazu ist ziemlich skizzenhaft und ich habe das Gefühl, dass Sie Scala/Java kennen müssen, um wirklich zu verstehen, was alles bedeutet. In der Zwischenzeit habe ich herausgefunden, wie man tatsächlich einige s3-Daten in pyspark bekommt und ich dachte, ich würde meine Ergebnisse teilen. Diese Dokumentation: Spark API documentation sagt, dass es ein Diktat verwendet, das in eine Java-Konfiguration (XML) konvertiert wird. Ich fand die Konfiguration für Java, ist dies wahrscheinlich die Werte widerspiegeln, sollten Sie in die dict setzen sollte: How to access S3/S3n from local hadoop installation

aus dem Eimer und Präfix (Dateipfad in den heißen Stein), die am ersten
bucket = "mycompany-mydata-bucket" 
prefix = "2015/04/04/mybiglogfile.log.gz" 
filename = "s3n://{}/{}".format(bucket, prefix) 

config_dict = {"fs.s3n.awsAccessKeyId":"FOOBAR", 
       "fs.s3n.awsSecretAccessKey":"BARFOO"} 

rdd = sc.hadoopFile(filename, 
        'org.apache.hadoop.mapred.TextInputFormat', 
        'org.apache.hadoop.io.Text', 
        'org.apache.hadoop.io.LongWritable', 
        conf=config_dict) 

Dieser Code-Schnipsel lädt die Datei zwei Linien.

+0

Funktioniert nicht für mich (spark1.5, hadoop2.4). Ich habe den Fehler "AWS Access Key ID und Secret Access Key müssen als Benutzername bzw. Passwort einer s3 URL angegeben werden, oder indem Sie die Eigenschaften fs.s3.awsAccessKeyId bzw. fs.s3.awsSecretAccessKey festlegen". Und die S3-URL ist dort nutzlos, da wenn du ein "/" im Schlüssel hast, es nicht funktioniert (HADOOP-3733) – mathieu

0

Die Einrichtung von Umgebungsvariablen könnte helfen.

Here in Spark FAQ unter der Frage "Wie kann ich auf Daten in S3 zugreifen?" Sie schlagen vor, Umgebungsvariablen AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY zu setzen.

+0

Ist diesem Link gefolgt und diese Frage scheint nicht mehr da zu sein. –

+0

@EvanZamir für Spark 2.0.0 könnte dies helfen https://github.com/amplab/spark-ec2#accessing-data-in-s3 –

1

Hier ist eine Lösung zum Lesen der Anmeldeinformationen von ~/.aws/credentials. Es nutzt die Tatsache, dass die Credentials-Datei eine INI-Datei ist, die mit Pythons Configparser analysiert werden kann.

import os 
import configparser 

config = configparser.ConfigParser() 
config.read(os.path.expanduser("~/.aws/credentials")) 

access_id = config.get(aws_profile, "aws_access_key_id") 
access_key = config.get(aws_profile, "aws_secret_access_key") 

Siehe auch mein Hauptpunkt bei https://gist.github.com/asmaier/5768c7cda3620901440a62248614bbd0.