2014-04-25 5 views
10

Ich automatisiere derzeit meine Apache Spark Pyspark-Skripte mit Clustern von EC2s mit Sparks vorkonfigurierten ./ec2-Verzeichnis. Für die Automatisierung und Terminplanung möchte ich das Boto EMR-Modul verwenden, um Skripte an den Cluster zu senden.läuft pyspark Skript auf EMR

Ich war in der Lage, Spark auf einem Cluster von EMRs zu installieren und zu installieren. Ich bin auch lokale ein Skript auf EMR starten kann Maschine Version von pyspark meiner durch die Verwendung und Einstellmeister wie solche:

$: MASTER=spark://<insert EMR master node of cluster here> ./bin/pyspark <myscriptname.py> 

Doch diese mich erfordert das Skript lokal auszuführen, und damit bin ich nicht Botos Fähigkeit 1) den Cluster zu starten, 2) die Scriptschritte hinzuzufügen und 3) den Cluster zu stoppen. Ich habe Beispiele mit script-runner.sh und emr "step" -Befehlen für Spark-Shell (scala) gefunden, aber ich nehme an, dass es eine einfachere Möglichkeit gibt, dies mit dem Python-Modul (pyspark) zu tun. Vielen Dank im Voraus!

Antwort

3

Dies könnte hilfreich sein, obwohl es nicht Boto verwendet.

Verwenden Sie aws CLI, um den Cluster zu erstellen und Schritte (Funke Job) hinzuzufügen.

1) Erstellen Sie den Cluster:

aws emr create-cluster --name "Spark cluster" --ami-version 3.8 --applications Name=Spark --ec2-attributes KeyName=ir --log-uri s3://Path/logs --instance-type m3.xlarge --instance-count 1 --use-default-roles 

2) Schritt (Funke Job) hinzuzufügen. Beachten Sie, dass Ihr Python-Skript im Master-Knoten gespeichert werden sollte (in diesem Fall ist es in/home/hadoop/spark).

aws emr add-steps --cluster-id j-xxxxxxx --steps Name=Spark,Jar=s3://eu-west-1.elasticmapreduce/libs/script-runner/script-runner.jar,Args=[/home/hadoop/spark/bin/spark-submit,--deploy-mode,client,/home/hadoop/spark/myscript.py],ActionOnFailure=CONTINUE 

Sie können auch zwei Schritte zu einem kombinieren und Cluster/Laufjob erstellen und den Cluster beenden.

Ein paar Anmerkungen: 1) ich mehr Möglichkeiten versucht habe, das Skript von S3 zu lesen, aber kein Glück :(

so landete ich es entweder Boto mit dem Kopieren oder aws an den Knoten cli 2), da ich war. Testen, dass auf einem Knoten in EMR der Bereitstellungsmodus in Schritt Client für Client ist, sollten Sie dies in Cluster ändern.

1

Sie müssen den Bereitstellungsmodus in Cluster (anstelle von Client) ändern, um von S3 auf das Skript zuzugreifen.

5

Hier ist ein great example von, wie es konfiguriert werden muss. Navigieren Sie zu "Ein schnelles Beispiel" für Python-Code.

Um jedoch die Dinge in emr-4.7.2 Arbeit zu machen, ein paar Veränderungen vorgenommen werden mußten, so ist hier ein AWS CLI-Befehl, der für mich gearbeitet:

aws emr add-steps --cluster-id <Your EMR cluster id> --steps Type=spark,Name=TestJob,Args=[--deploy-mode,cluster,--master,yarn,--conf,spark.yarn.submit.waitAppCompletion=true,s3a://your-source-bucket/code/pythonjob.py,s3a://your-source-bucket/data/data.csv,s3a://your-destination-bucket/test-output/],ActionOnFailure=CONTINUE 

Und hier ist ein Inhalt der pythonjob.py Datei:

from __future__ import print_function 
from pyspark import SparkContext 
import sys 
if __name__ == "__main__": 
    if len(sys.argv) != 3: 
     print("Usage: testjob ", file=sys.stderr) 
     exit(-1) 
    sc = SparkContext(appName="MyTestJob") 
    dataTextAll = sc.textFile(sys.argv[1]) 
    dataRDD = dataTextAll.map(lambda x: x.split(",")).map(lambda y: (str(y[0]), float(y[1]))).reduceByKey(lambda a, b: a + b) 
    dataRDD.saveAsTextFile(sys.argv[2]) 
    sc.stop() 

Es liest die data.csv Datei von S3, spaltet in jeder Zeile, wandelt ersten Wert auf String und einer zweiten zu schweben, Gruppen von ersten Wert und summiert die Werte in der zweiten Spalte, und schreibt das Ergebnis zurück zu S3.

Einige Kommentare:

  • Ich habe spark.yarn.submit.waitAppCompletion=true so zu verlassen entschieden, dass ich Job-Ausführung in der Konsole überwachen kann.
  • Eingangs- und Ausgangspfade (sys.argv[1] bzw. sys.argv[2]) werden als Teil der Auftragsübertragung (Args Abschnitt in add-steps Befehl) an das Skript übergeben.
  • Be aware, dass Sie s3a:// URI anstelle von s3n:// und für Hadoop 2.7+ bei der Konfiguration Ihres Jobs verwenden müssen.
  • Wenn Ihr Cluster in VPC ist, müssen Sie einen VPC Endpoint for Amazon S3 erstellen, wenn Sie von dort in Ihren EMR-Jobs lesen/schreiben wollen.
+0

Was ist, wenn Sie ein Skript innerhalb eines größeren Git-Repository ausführen möchten? Ich kann den Repo durch eine Bootstrap-Aktion in den Cluster klonen, aber wie kann man dann 'spark -submit --master garn/pfad/zu/script_to_run.py'? –

+0

@EvanZamir, ich denke, Sie können versuchen, einen [command runner] (http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html) in diesem Fall zu verwenden –