Determinar el número óptimo de particiones Spark en función de los trabajadores, los núcleos y el tamaño del Marco de datos
Hay varios conceptos similares pero diferentes en Spark-land que rodean cómo el trabajo se cultiva en diferentes nodos y se ejecuta simultáneamente. Específicamente, hay:
El nodo Spark DriversparkDriverCount
) El número de nodos de trabajo disponibles para un clúster de Spark numWorkerNodes
) El número de ejecutores de Spark numExecutors
)El DataFrame está siendo operado por todos los trabajadores / ejecutores, simultáneamente dataFrame
) El número de filas en eldataFrame
(numDFRows
) El número de particiones en eldataFrame
(numPartitions
) Y finalmente, el número de núcleos de CPU disponibles en cada nodo de trabajo numCpuCoresPerWorker
)I cree que todos los grupos de Spark tienenuno y solo un Spark Driver, y luego 0+ nodos de trabajo. Si me equivoco al respecto, ¡comience por corregirme! Suponiendo que estoy más o menos en lo cierto al respecto, fijemos algunas variables aquí. Supongamos que tenemos un clúster Spark con 1 controlador y 4 nodos de trabajo, y cada nodo de trabajo tiene 4 núcleos de CPU (un total de 16 núcleos de CPU). Entonces el "dado" aquí es:
sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16
Dado que, como configuración, me pregunto cómo determinar algunas cosas. Específicamente
¿Cuál es la relación entrenumWorkerNodes
ynumExecutors
? ¿Existe alguna proporción conocida / generalmente aceptada de trabajadores por ejecutores? ¿Hay alguna manera de determinarnumExecutors
dadonumWorkerNodes
(o cualquier otra entrada)? ¿Existe una relación conocida / generalmente aceptada / óptima denumDFRows
anumPartitions
? ¿Cómo se calcula el número 'óptimo' de particiones en función del tamaño de ladataFrame
? He oído de otros ingenieros que una 'regla general' general es:numPartitions = numWorkerNodes * numCpuCoresPerWorker
, ¿hay algo de verdad en eso? En otras palabras, prescribe que uno debe tener 1 partición por núcleo de CPU.