2017-02-23 2 views
-1

ich aws cli und ich starten Sie einen Cluster mit dem folgenden Befehl:AWS EMR - Hochladen in die Anwendung Master-Datei

aws emr create-cluster --name "Config1" --release-label emr-5.0.0 --applications Name=Spark --use-default-role --ec2-attributes KeyName=ChiaveEMR --log-uri 's3://aws-logs-813591802533-us-west-2/elasticmapreduce/' --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m1.medium InstanceGroupType=CORE,InstanceCount=2,InstanceType=m1.medium 

danach, habe ich eine Datei in den Master-Knoten:

aws emr put --cluster-id j-NSGFSP57255P --key-pair-file "ChiaveEMR.pem" --src "./configS3.txt" 

Die Datei befindet sich in /home/hadoop/configS3.txt. Dann starte ich einen Schritt:

aws emr add-steps --cluster-id ID_CLUSTER --region us-west-2 --steps Type=Spark,Name=SparkSubmit,Args=[--deploy-mode,cluster,--master,yarn,--executor-memory,1G,--class,Traccia2014,s3://tracceale/params/traccia-22-ottobre_2.11-1.0Ale.jar,/home/hadoop/configS3.txt,30,300,2,"s3a://tracceale/Tempi1"],ActionOnFailure=CONTINUE 

Aber ich bekomme diese Fehlermeldung:

17/02/23 14:49:51 ERROR ApplicationMaster: User class threw exception: java.io.FileNotFoundException: /home/hadoop/configS3.txt (No such file or directory) 
java.io.FileNotFoundException: /home/hadoop/configS3.txt (No such file or directory) 

wahrscheinlich aufgrund der Tatsache, dass ‚configS3.txt‘ auf dem Master befindet und nicht auf den Sklaven. Wie konnte ich 'configS3.txt' an Spark-Submit-Skript übergeben? Ich habe auch von S3 versucht, aber es funktioniert nicht. Irgendwelche Lösungen? Vielen Dank im Voraus

Antwort

0

Da Sie "--deploy-mode cluster" verwenden, wird der Treiber auf einer CORE/TASK-Instanz statt der MASTER-Instanz ausgeführt, also ja, weil Sie die Datei in die MASTER-Instanz hochgeladen haben Der Code, der auf die Datei zugreifen möchte, wird nicht auf der MASTER-Instanz ausgeführt.

Da der Fehler, dem Sie begegnen, eine FileNotFoundException ist, klingt es wie Ihr Anwendungscode versucht, es direkt zu öffnen, was bedeutet, dass Sie den S3-Pfad natürlich nicht einfach direkt verwenden können. (Sie können etwas wie eine neue Datei nicht machen ("s3: // bucket/key"), da Java keine Ahnung hat, wie Sie damit umgehen sollen.) Meine Annahme könnte jedoch falsch sein, weil Sie Ihren Anwendungscode nicht angegeben oder Ihnen erklärt haben machen mit dieser configS3.txt Datei.

+0

Ich muss ConfigS3.txt von S3 oder etwas anderes lesen. Ich übergebe den Pfad "s3: //tracceale/params/configS3.txt" an die Funktion 'fromFile' wie folgt: für (line <- scala.io.Source.fromFile (logFile) .getLines()) Diese Funktion kann einen S3-Pfad nicht lesen. Daher muss ich eine andere Strategie finden. –

0

Maurizio: Sie versuchen immer noch, your previous problem zu beheben.

Auf einem verteilten System benötigen Sie Dateien, die auf allen Rechnern sichtbar sind (die der s3: // Filestore liefert) und eine API verwenden, die mit Daten aus dem verteilten Dateisystem arbeitet. welches SparkContext.hadoopRDD() liefert. Sie werden nicht herausfinden, wie Sie eine Datei auf die lokale Festplatte jeder VM bringen können, denn das ist nicht das Problem, das Sie beheben müssen: So erhalten Sie Ihren Code zum Lesen von Daten aus dem gemeinsamen Objektspeicher .

Entschuldigung

+0

Wie kann ich diese Funktion SparkContext.hadoopRDD() verwenden? –

+0

Es ist in [Spark Programming Guide] behandelt (http://spark.apache.org/docs/latest/programming-guide.html#external-datasets) –

Verwandte Themen