Visão geral dos estágios do Spark
Um estágio em um processo de execução nada mais é do que um nível pelo qual cada uma das tarefas precisa passar. Todo o trabalho de faísca é dividido em vários estágios para o processamento eficiente de dados. Cada tarefa é executada em uma partição separada.
Sempre que um aplicativo de trabalho do Spark é enviado ao Spark pelo usuário, o driver do Spark o aceita e identifica os diferentes tipos de ações / transformações presentes no aplicativo. Além disso, essas operações serão organizadas em um diagrama de fluxo chamado DAG. Um DAG (gráfico acíclico direcionado) é criado sempre que uma ação ou transformação é chamada no RDD, que por sua vez chama o DAGScheduler.
O significado de DAG é o seguinte:
- Dirigido: Todos os nós são conectados um ao outro, criando um gráfico acíclico. A sequência disso é determinada pelas ações chamadas no RDD.
- Acíclico: os nós não estão conectados como um loop cíclico, ou seja, se uma ação ou transformação foi feita uma vez, não pode ser revertida ao seu valor original.
- Gráfico: todo o padrão formado pelas arestas e vértices dispostos juntos em um padrão específico é chamado de gráfico. Os vértices nada mais são do que RDDs e as arestas são as ações chamadas no RDD.
O DAGScheduler é aquele que divide os estágios em várias tarefas. O DAGScheduler passa as informações do estágio para o gerenciador de cluster (YARN / Spark independente) que aciona o agendador de tarefas para executar as tarefas. O driver Spark converte o plano lógico em um plano de execução físico. Os trabalhos do Spark são executados no método de pipelining, em que todas as tarefas de transformação são combinadas em um único estágio.
Transformações
Existem 2 tipos de transformações que ocorrem:
1. Transformações estreitas : são transformações que não requerem o processo de embaralhamento. Essas ações podem ser executadas em um único estágio.
Exemplo: map () e filter ()
2. Transformações amplas : são transformações que exigem o embaralhamento entre várias partições. Portanto, exige que diferentes estágios sejam criados para comunicação entre diferentes partições.
Exemplo: ReduceByKey
Vamos dar um exemplo para uma melhor compreensão de como isso funciona.
Exemplo: neste exemplo, veremos como uma contagem simples de palavras funciona usando o Spark DAGScheduler.
- val data = sc.textFile ("data.txt")
Resultado: data: org.apache.spark.rdd.RDD (String) = data.txt MapPartitionsRDD (46) no textFile em: 24
Primeiro, uma operação textFile é executada para ler o arquivo de texto de entrada fornecido no local do HDFS.
- data.flatMap (_. split (”“)). map (i => (i, 1)). reduzaByKey (_ + _). collect
Resultado: res21: Matriz ((String, Int)) = Matriz ()
Em seguida, uma operação flatMap é executada para dividir as linhas no arquivo de entrada inteiro em palavras diferentes. Em seguida, é realizada uma operação de mapa para formar pares (chave, valor) como (palavra, 1) para cada uma das palavras. E a função reduzirByKey é chamada para encontrar a soma das contagens para cada palavra. Finalmente, a ação coletiva dará o resultado final, coletando todos os dados.
Durante esse programa, 2 estágios são criados pelo Spark porque uma transformação é realizada aqui. Enquanto a operação de transformação é concluída, o embaralhamento precisa ser executado porque os dados precisam ser embaralhados entre 2 ou mais partições diferentes. Portanto, para isso, um estágio é criado e outro estágio único para a tarefa de transformação é criado.
Também internamente esses estágios serão divididos em tarefas. Neste exemplo, cada estágio é dividido em 2 tarefas, pois existem 2 partições. Cada partição executa uma tarefa individual.
Tipos de estágios de centelha
Aqui estão os dois tipos de estágios de centelha dados abaixo
1. ShuffleMapStage
Este é basicamente um estágio intermediário no processo de execução do DAG. A saída desse estágio é usada como entrada para outros estágios. A saída disso é na forma de arquivos de saída de mapa que podem ser usados posteriormente, reduzindo a tarefa. Um ShuffleMapStage é considerado pronto quando todas as saídas de mapa estiverem disponíveis. Às vezes, os locais de saída podem estar ausentes nos casos em que as partições estão perdidas ou não estão disponíveis.
Esse estágio pode conter muitas operações de pipeline, como map () e filter () antes da execução do embaralhamento. Os registros internos outputLocs e _numAvailableOutputs são usados pelo ShuffleMapStage para rastrear o número de saídas do mapa aleatório. Um único ShuffleMapStage pode ser usado normalmente em vários trabalhos.
2. ResultStage
Como o próprio nome sugere, esse é o estágio final de um trabalho do Spark que executa uma operação em uma ou mais partições de um RDD para calcular seu resultado. A inicialização dos registros e contadores internos é feita pelo ResultStage.
O DAGScheduler envia tarefas ausentes, se houver, para o ResultStage para cálculo. Para o cálculo, são necessários vários parâmetros obrigatórios, como stageId, stageAttempId, a variável de difusão da tarefa serializada, partição, TaskLocations preferenciais, outputId, algumas propriedades locais, TaskMetrics desse estágio específico. Alguns dos parâmetros opcionais necessários são ID da tarefa, ID do aplicativo e ID da tentativa do aplicativo.
Vantagens dos estágios de faísca
Abaixo estão as diferentes vantagens do Spark Stages:
1. Alocação dinâmica de executores
Ao ver a Linha do tempo do evento do Spark Job, podemos ver que a alocação de executores é feita dinamicamente. Isso significa que os executores são chamados do cluster, dependendo da carga de trabalho durante o curso da execução da tarefa. Em seguida, ele é liberado de volta ao cluster assim que seu trabalho é concluído. Isso economiza a memória de alocação de recursos e permite que os outros aplicativos em execução no mesmo cluster reutilizem os executores. Portanto, a utilização geral do cluster aumentará e será ideal.
2. Cache
Os RDDs são armazenados em cache durante as operações executadas neles em cada estágio e armazenados na memória. Isso é útil para economizar tempo computacional quando o resultado final exige que os mesmos RDDs sejam lidos novamente a partir do HDFS.
3. Execução paralela
Os trabalhos de faísca que são independentes um do outro são executados em paralelo, a menos e até que seja necessário embaralhar ou a entrada de um estágio depende da saída anterior.
4. Visualização do DAG
Isso é muito útil em casos de cálculos complexos em que muitas operações e suas dependências estão envolvidas. Vendo essa visualização do DAG, é possível rastrear facilmente o fluxo e identificar os bloqueios de desempenho. Além disso, é possível ver cada uma das tarefas executadas por cada estágio clicando nos estágios mostrados nesta visualização. Nesta visão expandida, são mostrados todos os detalhes dos RDDs que pertencem a esse estágio.
5. tolerância a falhas
Devido à operação de armazenamento em cache realizada nos RDDs, o DAG terá um registro de cada ação executada neles. Portanto, suponha que, em qualquer caso, um RDD seja perdido, ele possa ser recuperado facilmente com a ajuda do DAG. O gerenciador de cluster pode ser usado para identificar a partição na qual foi perdida e o mesmo RDD pode ser colocado novamente na mesma partição para recuperação de perda de dados.
Devido aos benefícios mencionados acima, o Apache Spark está sendo amplamente utilizado em vez do MapReduce usado anteriormente. Os estágios Spark não passam de uma versão estendida do MapReduce. Como o MapReduce exigia que os dados fossem lidos e gravados no HDFS várias vezes, o Spark foi introduzido, que executa essas ações em sua memória.
Conclusão
Portanto, podemos concluir que os estágios do Spark são mais eficientes devido ao cálculo na memória, maior velocidade de processamento, mesmo para o processamento iterativo.
Artigos recomendados
Este é um guia para os estágios do Spark. Aqui discutimos os tipos de transformação e os tipos e vantagens dos estágios de centelha. Você também pode consultar os seguintes artigos para saber mais -
- Como instalar o Spark
- Spark Streaming
- Carreira no Spark
- Perguntas da entrevista do Spark
- Visão geral e os 6 principais componentes do Spark