2017-02-13 3 views
0

Ich denke, ich verstehe nicht genug, um Jobs zu starten.Wie starten Sie parallele Funkenjobs?

Ich habe einen Job, der 60 Sekunden dauert, um zu beenden. Ich betreibe es mit folgenden Befehl ein:

spark-submit --executor-cores 1 \ 
      --executor-memory 1g \ 
      --driver-memory 1g \ 
      --master yarn \ 
      --deploy-mode cluster \ 
      --conf spark.dynamicAllocation.enabled=true \ 
      --conf spark.shuffle.service.enabled=true \ 
      --conf spark.dynamicAllocation.minExecutors=1 \ 
      --conf spark.dynamicAllocation.maxExecutors=4 \ 
      --conf spark.dynamicAllocation.initialExecutors=4 \ 
      --conf spark.executor.instances=4 \ 

Wenn i Anzahl der Partitionen von Code und die Anzahl der Testamentsvollstrecker erhöhen die App schneller fertig wird, die es in Ordnung ist. Aber wenn ich nur Executor-Cores erhöhe, ist die Endzeit gleich und ich verstehe nicht warum. Ich erwarte, dass die Zeit niedriger ist als die Anfangszeit.

Mein zweites Problem ist, wenn ich zweimal über Code starte ich erwarte, dass beide Aufträge in 60 Sekunden enden, aber das passiert nicht. Beide Jobs enden nach 120 Sekunden und ich verstehe nicht warum.

Ich führe diesen Code auf AWS EMR, auf 2 Instanzen (4 CPU pro, und jede CPU hat 2 Threads). Von dem, was ich in Standard-EMR-Konfigurationen gesehen habe, wird Garn mit CapacityScheduler in den FIFO (Standard) -Modus gesetzt.

Was denken Sie über diese Probleme?

Antwort

1

Spark erstellt Partitionen basierend auf einer Logik in der Datenquelle. In Ihrem Fall erstellt es wahrscheinlich eine Anzahl von Partitionen, die kleiner ist als die Anzahl der ausführenden Executor-Kerne, so dass die Kerne nicht schneller laufen, da diese leer sind. Wenn Sie auch die Anzahl der Partitionen erhöhen, kann es schneller arbeiten.

Wenn Sie spark-submit zweimal ausführen, besteht eine gute Chance, dass die dynamische Zuweisung die maximale Zuweisung von Executoren erreicht, bevor die zweite ausgeführt wird (in Ihrem Fall dauert es ~ 4 Sekunden). Abhängig davon, wie Garn definiert wurde, kann dies alle verfügbaren Executoren füllen (entweder weil die Anzahl der definierten Threads zu klein ist oder weil der Speicher voll ist). In jedem Fall, wenn dies tatsächlich passiert, würde die zweite Funken-Submit-Verarbeitung nicht beginnen, bis ein Executor frei ist, was bedeutet, dass er die Summe der Male benötigt.

BTW erinnern, dass im Cluster-Modus der Treiber einen Executor auch aufnimmt ...