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