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-TreiberknotensparkDriverCount
) 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.