Bestimmen der optimalen Anzahl von Spark-Partitionen basierend auf Worker, Cores und DataFrame-Größe

In Spark-Land gibt es mehrere ähnliche, aber unterschiedliche Konzepte, wie die Arbeit auf verschiedene Knoten verteilt und gleichzeitig ausgeführt wird. Im Einzelnen gibt es:

Der Spark-Treiberknoten sparkDriverCount) Die Anzahl der Worker-Knoten, die einem Spark-Cluster zur Verfügung stehen numWorkerNodes) Die Anzahl der Spark-Executoren numExecutors)Der DataFrame wird von allen Mitarbeitern / Ausführenden gleichzeitig bearbeitet dataFrame) Die Anzahl der Zeilen imdataFrame (numDFRows) Die Anzahl der Partitionen auf demdataFrame (numPartitions)Und schließlich die Anzahl der auf jedem Worker-Knoten verfügbaren CPU-Kerne numCpuCoresPerWorker)

I glaube dass alle Spark-Cluster habender eine und einzig Spark-Treiber und dann 0+ Worker-Knoten. Wenn ich mich irre, bitte korrigieren Sie mich! Angenommen, ich habe mehr oder weniger recht, lassen Sie uns hier ein paar Variablen einschließen. Angenommen, wir haben einen Spark-Cluster mit 1 Treiber- und 4 Worker-Knoten, und auf jedem Worker-Knoten befinden sich 4 CPU-Kerne (also insgesamt 16 CPU-Kerne). Das "Gegebene" hier ist also:

sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16

Gegeben, dass als Setup, ich frage mich, wie ein paar Dinge zu bestimmen sind. Speziell

Was ist die Beziehung zwischennumWorkerNodes undnumExecutors? Gibt es ein bekanntes / allgemein akzeptiertes Verhältnis von Arbeitnehmern zu Vollstreckern? Gibt es eine Möglichkeit, @ zu bestimmnumExecutors gegebennumWorkerNodes (oder andere Eingaben)? Gibt es ein bekanntes / allgemein akzeptiertes / optimales Verhältnis vonnumDFRows zunumPartitions? Wie berechnet man die 'optimale' Anzahl von Partitionen basierend auf der Größe desdataFrame? Ich habe von anderen Ingenieuren gehört, dass eine allgemeine Faustregel lautet:numPartitions = numWorkerNodes * numCpuCoresPerWorker, stimmt das? Mit anderen Worten, es wird vorgeschrieben, dass eine Partition pro CPU-Kern vorhanden sein muss.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage