2014-04-25 39 views
10

Obecnie zautomatyzowałem skrypty Apache Spark Pyspark za pomocą klastrów EC2, używając wstępnie skonfigurowanego katalogu Sparks ./ec2. Dla celów automatyzacji i planowania, chciałbym użyć modułu Boto EMR do wysyłania skryptów do klastra.uruchamianie skryptu Pyspark na EMR

Udało mi się załadować i zainstalować Spark na klastrze EMR. Jestem również w stanie uruchomić skrypt na EMR za pomocą wersji mojego lokalnego urządzenia z pyspark i ustawienie mistrza jak takie:

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

Wymaga to jednak mi się uruchomić ten skrypt lokalnie, a więc nie jestem w stanie w pełni wykorzystać zdolność Boto do 1) uruchomienia klastra 2) dodać kroki skryptu i 3) zatrzymać klaster. Znalazłem przykłady, używając komend script -runner.sh i emr "step" dla iskry-powłoki (scala), ale zakładam, że jest to łatwiejszy sposób z modułem Python (pyspark). Dziękuję bardzo z góry!

Odpowiedz

3

To może być pomocne, ponieważ nie używa boto.

Użyj aws cli, aby utworzyć klaster i dodać do niego kroki (zadanie iskier).

1) Tworzenie klastra:

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) dodać etap (zadanie zapłonową). Zauważ, że Twój skrypt Pythona powinien być przechowywany w węźle głównym (w tym przypadku jest on w/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 

można także połączyć dwa kroki w jeden i utworzyć zadanie klastrowe/uruchom i zakończyć klaster.

Kilka uwag: 1) Próbowałem wielu sposobów, aby czytać skrypt z S3 ale nie szczęścia :(

więc skończyło się na kopiowanie przy użyciu boto lub AWS CLI do węzła 2), ponieważ byłem. testowanie, że na jednym węźle w emr tryb wdrażania w kroku jest klientem dla klienta, powinieneś zmienić to na klaster.

1

należy zmienić tryb wdrażania na klaster (zamiast klienta), aby uzyskać dostęp do skryptu z S3.

5

Oto great example, w jaki sposób należy go skonfigurować. Przejdź do "Szybki przykład" dla kodu Python.

Jednak w celu dokonania rzeczy pracujących w EMR-4.7.2, kilka poprawek musiały zostać wykonane, więc o to komenda AWS CLI, który pracował dla mnie:

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 

I tu jest zawartość pythonjob.py pliku:

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() 

odczytuje plik z S3 data.csv, dzieli każdy rząd, zamienia pierwszą wartość na ciąg i drugi się unosić, grupy o pierwszej wartości i sumuje wartości w drugiej kolumnie i zapisuje wynik z powrotem do S3.

Kilka komentarzy:

  • Zdecydowałem się opuścić spark.yarn.submit.waitAppCompletion=true więc że mogę monitorować wykonanie pracy w konsoli.
  • Ścieżki wejściowe i wyjściowe (odpowiednio sys.argv[1] i sys.argv[2]) są przekazywane do skryptu jako część zadania roboczego (sekcja Args w poleceniu add-steps).
  • Be aware Musisz użyć identyfikatora URI s3a:// zamiast s3n:// i s3:// dla Hadoop 2.7+ podczas konfigurowania swojej pracy.
  • Jeśli Twój klaster znajduje się w VPC, musisz utworzyć VPC Endpoint for Amazon S3, jeśli zamierzasz odczytać/zapisać w nim swoje zadania EMR.
+0

Co zrobić, jeśli chcesz uruchomić skrypt w większym repozytorium git? Mogę sklonować repo do klastra za pomocą akcji bootstrap, ale jak to zrobić "spark-submit - master przędza/path/to/script_to_run.py"? –

+0

@EvanZamir, Myślę, że możesz spróbować użyć [command runner] (http://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-commandrunner.html) w tym przypadku –

Powiązane problemy