Vamos assumir o seguinte: apenas um trabalho do Spark está sendo executado a cada momento.
O que eu recebo até agora
Aqui está o que eu entendo o que acontece no Spark:
- Quando a
SparkContext
é criado, cada nó do trabalhador inicia um executor. Executores são processos separados (JVM), que se conectam novamente ao programa do driver. Cada executor possui o jar do programa do driver. Sair de um driver, desliga os executores. Cada executor pode conter algumas partições. - Quando um trabalho é executado, um plano de execução é criado de acordo com o gráfico de linhagem.
- O trabalho de execução é dividido em estágios, em que estágios contém tantas transformações e ações vizinhas (no gráfico de linhagem), mas sem embaralhamento. Assim, os estágios são separados por shuffles.
Eu entendi aquilo
- Uma tarefa é um comando enviado do driver para um executor serializando o objeto Function.
- O executor desserializa (com o jar do driver) o comando (tarefa) e o executa em uma partição.
mas
Questões)
Como divido o palco nessas tarefas?
Especificamente:
- As tarefas são determinadas pelas transformações e ações ou podem haver várias transformações / ações em uma tarefa?
- As tarefas são determinadas pela partição (por exemplo, uma tarefa por estágio por partição).
- As tarefas são determinadas pelos nós (por exemplo, uma tarefa por estágio por nó)?
O que eu acho (apenas resposta parcial, mesmo que correta)
Em https://0x0fff.com/spark-architecture-shuffle , o shuffle é explicado com a imagem
e tenho a impressão de que a regra é
cada estágio é dividido em # tarefas de número de partições, sem levar em consideração o número de nós
Para minha primeira imagem, eu diria que teria 3 tarefas de mapa e 3 tarefas de redução.
Para a imagem de 0x0fff, eu diria que existem 8 tarefas de mapa e 3 tarefas de redução (supondo que haja apenas três arquivos laranja e três verde escuro).
Perguntas abertas em qualquer caso
Isso está correto? Mas mesmo que isso esteja correto, minhas perguntas acima não são todas respondidas, porque ainda está em aberto, se várias operações (por exemplo, mapas múltiplos) estão dentro de uma tarefa ou são separadas em uma tarefa por operação.
O que os outros dizem
O que é uma tarefa no Spark? Como o trabalhador Spark executa o arquivo jar? e Como o agendador do Apache Spark divide arquivos em tarefas? são semelhantes, mas não achei que minha pergunta fosse respondida claramente lá.
fonte
sum(..)
para levar em conta essa variação.Isso pode ajudá-lo a entender melhor as diferentes partes:
fonte
Se bem entendi, existem 2 coisas (relacionadas) que confundem você:
1) O que determina o conteúdo de uma tarefa?
2) O que determina o número de tarefas a serem executadas?
O mecanismo do Spark "cola" em conjunto operações simples em rdds consecutivos, por exemplo:
portanto, quando o rdd3 for computado (preguiçosamente), o spark gerará uma tarefa por partição do rdd1 e cada tarefa executará o filtro e o mapa por linha para resultar no rdd3.
O número de tarefas é determinado pelo número de partições. Todo RDD possui um número definido de partições. Para um RDD de origem que é lido do HDFS (usando sc.textFile (...) por exemplo), o número de partições é o número de divisões geradas pelo formato de entrada. Algumas operações no RDD (s) podem resultar em um RDD com um número diferente de partições:
Outro exemplo é junções:
(A maioria) das operações que alteram o número de partições envolvem um shuffle. Quando fazemos, por exemplo:
o que realmente acontece é que a tarefa em cada partição do rdd1 precisa produzir uma saída final que possa ser lida no estágio a seguir, para que o rdd2 tenha exatamente 1000 partições (como elas fazem isso? Hash ou Sort ). As tarefas deste lado são às vezes chamadas de "Tarefas do mapa (lado)". Uma tarefa que será executada posteriormente no rdd2 atuará em uma partição (do rdd2!) E terá que descobrir como ler / combinar as saídas do lado do mapa relevantes para essa partição. As tarefas deste lado são às vezes chamadas de "Reduzir tarefas (laterais)".
As 2 perguntas estão relacionadas: o número de tarefas em um estágio é o número de partições (comuns aos rdds consecutivos "colados" juntos) e o número de partições de um rdd pode mudar entre os estágios (especificando o número de partições para alguns baralhar causando operação, por exemplo).
Depois que a execução de um estágio começa, suas tarefas podem ocupar slots de tarefas. O número de slots de tarefas simultâneos é numExecutors * ExecutorCores. Em geral, eles podem ser ocupados por tarefas de diferentes estágios não dependentes.
fonte