Wie man Funken Executor Nummer, Kerne und Executor Speicher stimmt?
Wo fangen Sie bei der Optimierung der oben genannten Parameter. Fangen wir mit executor Speicher und bekommen Anzahl der Vollzieher, oder wir beginnen mit Kernen und Holen Sie sich die executor Nummer. Ich folgte der link. Jedoch bekam eine hohe Idee, aber noch nicht sicher, wie oder wo Sie anfangen und kommen zu einem abschließenden Fazit.
InformationsquelleAutor der Frage Ramzy | 2016-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende Antwort umfasst die 3 wichtigsten genannten Aspekte in Titel - Anzahl der Vollzieher, Vollstrecker Speicher und Anzahl der Kerne. Es können auch andere Parameter wie Treiber, Speicher, und andere, die ich nicht angesprochen als dieser Antwort, möchte aber noch hinzufügen in Naher Zukunft.
Fall 1 Hardware - 6 Knoten, und Jeder Knoten 16 cores, 64 GB RAM
Jeder Testamentsvollstrecker ist eine JVM-Instanz. So können wir mehrere Testamentsvollstrecker in einem einzigen Knoten
Ersten 1 core und 1 GB benötigt für OS und Hadoop Daemons, so sind 15 Kerne, 63 GB RAM für jeden Knoten
Starten Sie mit, wie die Anzahl der Kerne:
Anzahl der Vollzieher:
Speicher für jeden Vollzieher:
Endgültigen zahlen - Vollzieher - 17, - Kerne 5, Testamentsvollstrecker Speicher - 19 GB
Fall 2 Hardware : 6 Gleichen Knoten, 32 Cores, 64 GB
5 ist die gleiche für gute Parallelität
Anzahl der Vollzieher für jede node = 32/5 ~ 6
Also insgesamt Vollzieher = 6 * 6 Knoten = 36. Dann die Letzte Zahl ist die 36 - 1 für AM = 35
Testamentsvollstrecker Speicher : 6 Testamentsvollstrecker für jeden Knoten. 63/6 ~ 10 . Über Kopf ist .07 * 10 = 700 MB. Also, Rundung auf 1 GB über den Kopf, wir bekommen 10-1 = 9 GB
Endgültigen zahlen - Vollzieher - 35, - Kerne 5, Testamentsvollstrecker Speicher 9 GB
Fall 3
Den oben genannten Szenarien beginnen mit Annahme der Anzahl der Kerne als Feste und bewegliche # der Vollzieher und der Speicher.
Nun für den ersten Fall, wenn wir denken, wir brauchen nicht, 19 GB, und nur 10 GB ausreichend ist, dann werden die folgenden Nummern:
Kerne 5
# der Vollzieher für jede node = 3
In diesem Stadium dazu führen würde 21, und dann mit 19 nach unserer ersten Berechnung. Aber da dachten wir, dass 10 ist ok (übernehmen wenig Aufwand), dann können wir nicht wechseln # der Vollzieher
pro Knoten 6 (wie 63/10). Becase mit 6 Vollzieher pro Knoten und 5 Kerne kommt es auf 30 Kerne pro Knoten, wenn wir nur 16 Kerne. So müssen wir auch ändern Sie die Anzahl der
Kerne für jeden executor.
Damit die Berechnung wieder,
Die Magische Zahl 5 wird zu 3 - (irgendeine Zahl weniger als oder gleich 5 ist). So mit 3 Kernen und 15 Kerne - wir bekommen 5 Vollzieher pro Knoten. Also (5*6 -1) = 29 Vollzieher
Also Speicher ist 63/5 ~ 12. Über Kopf ist 12*.07=.84
So executor Speicher 12 - 1 GB = 11 GB
Endgültigen Zahlen sind 29 Vollzieher, 3 Kerne, Testamentsvollstrecker Speicher ist mit 11 GB
Die Dynamische Zuordnung:
Hinweis : Obere Schranke für die Anzahl der Vollzieher, wenn die dynamische Zuordnung aktiviert ist. Es sagt also, dass die Funke-Anwendung kann fressen alle Ressourcen, wenn nötig. So in
ein cluster, in dem Sie andere Anwendungen ausgeführt werden, und Sie müssen auch Kerne von tasks ausführen zu bitte stellen Sie sicher, Sie tun es in der cluster-Ebene. Ich meine, Sie können zuweisen
bestimmte Anzahl von Kernen für GARN, basierend auf Benutzer-Zugang. So können Sie spark_user werden können und dann geben die Kerne (min/max) für diesen Benutzer. Diese Grenzen sind für den Austausch zwischen spark und andere Anwendungen, die auf das GARN.
Funken.dynamicAllocation.aktiviert - Wenn dieser auf true gesetzt ist - Wir müssen nicht erwähnen Vollzieher. Der Grund ist unten:
Den statischen params Nummer geben wir an der Funke zu übermitteln ist für die gesamte Arbeit Dauer. Allerdings, wenn die dynamische Zuordnung kommt ins Bild, es würde auf verschiedenen Bühnen wie
Was für den Anfang :
Anfängliche Zahl der Vollzieher (Funken.dynamicAllocation.initialExecutors), um mit zu beginnen
Wie viele :
Dann anhand der Auslastung (anstehender Aufgaben), wie viele zu beantragen. Dies würde letztlich das zahlen, was wir geben im spark-reichen in statischer Weise. Also, sobald die ersten executor-Nummern eingestellt sind, gehen wir zu min (Funken.dynamicAllocation.minExecutors) und max (Funken.dynamicAllocation.maxExecutors) zahlen.
, Wenn Fragen oder geben:
Wenn wir neue Anfrage Vollzieher (Funken.dynamicAllocation.schedulerBacklogTimeout) - Es wurden die anstehenden Aufgaben für diese viel Dauer. so verlangen. Anzahl der Testamentsvollstrecker beantragt, in jeder Runde exponentiell erhöht aus der vorherigen Runde. Zum Beispiel, eine Anwendung hinzufügen 1 Vollstrecker in der ersten Runde, und dann 2, 4, 8 und so weiter Vollzieher in die nachfolgenden Runden. An einem bestimmten Punkt, der über max kommt ins Bild
Wann wir verschenken einen Testamentsvollstrecker (Funken.dynamicAllocation.executorIdleTimeout) -
Bitte korrigieren Sie mich, wenn ich nichts übersehen habe. Das oben ist mein Verständnis basiert auf dem blog, die ich gemeinsam in Frage und einige online-Ressourcen. Danke.
Referenzen:
InformationsquelleAutor der Antwort Ramzy
Auch, es hängt von Ihrem Anwendungsfall, eine wichtige config-parameter ist:
spark.memory.fraction
(Bruchteil (heap-space - 300MB) für die Durchführung und Lagerung) von http://spark.apache.org/docs/latest/configuration.html#memory-management.Wenn Sie nicht verwenden cache/beibehalten, stellen Sie es auf 0.1, so dass Sie alle haben den Speicher für Ihr Programm.
Wenn du cache/anhalten, können Sie überprüfen Sie den Speicher übernommen durch:
Liest du die Daten aus HDFS oder HTTP?
Wieder, ein tuning hängt von Ihrem Anwendungsfall.
InformationsquelleAutor der Antwort Thomas Decaux