В Spark-land существует несколько аналогичных концепций, но все же разные понятия, связанные с тем, как работа обрабатывается на разных узлах и выполняется одновременно. В частности, есть:
- Драйвер Spark node (
sparkDriverCount
) - Число рабочих узлов, доступных для Spark-кластера (
numWorkerNodes
) - Число исполнителей Spark (
numExecutors
) - DataFrame управляется всеми рабочими/исполнителями одновременно (
dataFrame
) - Число строк в
dataFrame
(numDFRows
) - Число разделов на
dataFrame
(numPartitions
) - И, наконец, количество ядер процессора, доступных на каждом рабочем узле (
numCpuCoresPerWorker
)
Я считаю, что все Spark-кластеры имеют один и только один Spark Driver, а затем 0+ рабочих узлов. Если я ошибаюсь, начните с исправления! Предполагая, что я более или менее корректен в этом вопросе, позвольте заблокировать здесь несколько переменных. Скажем, у нас есть Spark-кластер с 1 драйвером и 4 рабочими узлами, и каждый Worker node имеет на нем 4 ядра процессора (так что в общей сложности 16 ядер процессора). Итак, "данный" здесь:
sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16
Учитывая, что в качестве настройки мне интересно, как определить несколько вещей. В частности:
- Какова связь между
numWorkerNodes
иnumExecutors
? Существует ли известное/общепринятое отношение работников к исполнителям? Есть ли способ определитьnumExecutors
с учетомnumWorkerNodes
(или любых других входов)? - Существует ли известное/общепринятое/оптимальное отношение
numDFRows
tonumPartitions
? Как вычислить "оптимальное" количество разделов на основе размераdataFrame
? - Я слышал от других инженеров, что общее "эмпирическое правило":
numPartitions = numWorkerNodes * numCpuCoresPerWorker
, любая правда к этому? Другими словами, он предписывает, что для каждого ядра процессора должен быть 1 раздел.