Determinação do número ideal de partições Spark com base em trabalhadores, núcleos e tamanho do DataFrame

Existem vários conceitos semelhantes, porém diferentes, no Spark-land que envolvem como o trabalho é distribuído em diferentes nós e executado simultaneamente. Especificamente, há:

O nó do Driver Spark sparkDriverCount)O número de nós do trabalhador disponíveis para um cluster Spark numWorkerNodes)O número de executores do Spark numExecutors) O DataFrame sendo operado por todos os trabalhadores / executores simultaneamente dataFrame)O número de linhas nodataFrame (numDFRows)O número de partições nodataFrame (numPartitions) E finalmente, o número de núcleos de CPU disponíveis em cada nó de trabalho numCpuCoresPerWorker)

I acredita que todos os clusters Spark têmum e somente u Spark Driver e mais de 0 nós de trabalho. Se eu estiver errado sobre isso, por favor, comece me corrigindo! Supondo que eu esteja mais ou menos correto sobre isso, vamos bloquear algumas variáveis aqui. Digamos que tenhamos um cluster Spark com 1 driver e 4 nós Worker, e cada nó Worker tenha 4 núcleos de CPU (um total de 16 núcleos de CPU). Portanto, o "dado" aqui é:

sparkDriverCount = 1
numWorkerNodes = 4
numCpuCores = numWorkerNodes * numCpuCoresPerWorker = 4 * 4 = 16

Desde que, como a instalação, eu estou querendo saber como determinar algumas coisas. Especificamente

Qual é a relação entrenumWorkerNodes enumExecutors? Existe alguma proporção conhecida / geralmente aceita de trabalhadores por executores? Existe uma maneira de determinarnumExecutors givennumWorkerNodes (ou quaisquer outras entradas)? Existe uma proporção conhecida / geralmente aceita / ideal denumDFRows paranumPartitions? Como se calcula o número 'ideal' de partições com base no tamanho dadataFrame? Ouvi de outros engenheiros que uma regra geral é:numPartitions = numWorkerNodes * numCpuCoresPerWorker, alguma verdade nisso? Em outras palavras, prescreve que um deve ter 1 partição por núcleo de CP

questionAnswers(1)

yourAnswerToTheQuestion