Определение оптимального количества разделов Spark на основе рабочих, ядер и размера DataFrame

В Spark-land существует несколько похожих, но разных концепций, касающихся того, как работа передается на разные узлы и выполняется одновременно. В частности, есть:

Узел Spark Driver sparkDriverCount) Количество рабочих узлов, доступных для кластера 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 раздел.

Ответы на вопрос(1)

Ваш ответ на вопрос