Estou tentando entender a relação do número de núcleos e o número de executores ao executar uma tarefa do Spark no YARN.
O ambiente de teste é o seguinte:
- Número de nós de dados: 3
- Especificação da máquina do nó de dados:
- CPU: Core i7-4790 (nº de núcleos: 4, nº de threads: 8)
- RAM: 32 GB (8 GB x 4)
- HDD: 8 TB (2 TB x 4)
Rede: 1Gb
Versão Spark: 1.0.0
Versão do Hadoop: 2.4.0 (Hortonworks HDP 2.1)
Fluxo de trabalho do Spark: sc.textFile -> filtro -> mapa -> filtro -> mapToPair -> reduzirByKey -> mapa -> saveAsTextFile
Dados de entrada
- Tipo: arquivo de texto único
- Tamanho: 165GB
- Número de linhas: 454.568.833
Resultado
- Número de linhas após o segundo filtro: 310,640,717
- Número de linhas do arquivo de resultados: 99.848.268
- Tamanho do arquivo de resultado: 41GB
O trabalho foi executado com as seguintes configurações:
--master yarn-client --executor-memory 19G --executor-cores 7 --num-executors 3
(executores por nó de dados, use até núcleos)--master yarn-client --executor-memory 19G --executor-cores 4 --num-executors 3
(número de núcleos reduzido)--master yarn-client --executor-memory 4G --executor-cores 2 --num-executors 12
(menos núcleo, mais executor)
Tempos decorridos:
50 min 15 seg
55 min 48 seg
31 min 23 seg
Para minha surpresa, (3) foi muito mais rápido.
Eu pensei que (1) seria mais rápido, pois haveria menos comunicação entre executores ao embaralhar.
Embora o número de núcleos de (1) seja menor que (3), o número de núcleos não é o fator principal, pois 2) teve um bom desempenho.
(Seguintes foram adicionados após a resposta de pwilmot.)
Para obter informações, a captura de tela do monitor de desempenho é a seguinte:
- Resumo do nó de dados Ganglia para (1) - trabalho iniciado às 04:37.
- Resumo do nó de dados Ganglia para (3) - trabalho iniciado às 19:47. Por favor, ignore o gráfico antes dessa hora.
O gráfico divide-se aproximadamente em 2 seções:
- Primeiro: do começo ao reduzirByKey: uso intensivo da CPU, nenhuma atividade de rede
- Segundo: depois de reduzem-seByKey: a CPU diminui, a E / S da rede é concluída.
Como mostra o gráfico, (1) pode usar a energia da CPU que foi fornecida. Portanto, pode não ser o problema do número de threads.
Como explicar esse resultado?