Определение оптимального количества разделов Spark на основе рабочих, ядер и размера DataFrame
В Spark-land существует несколько похожих, но разных концепций, касающихся того, как работа передается на разные узлы и выполняется одновременно. В частности, есть:
Узел Spark DriversparkDriverCount
) Количество рабочих узлов, доступных для кластера Spark numWorkerNodes
) Количество исполнителей Spark numExecutors
) DataFrame используется всеми работниками / исполнителями одновременно dataFrame
) Количество строк вdataFrame
(numDFRows
) Количество разделов наdataFrame
(numPartitions
) И, наконец, количество ядер ЦП, доступных на каждом рабочем узле numCpuCoresPerWorker
)I Верю что все кластеры Spark имеют Один-и-только-один 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 раздел.