Spark · tema 9 de 30
Spark: introdução
35 min · 2 vídeos · 12 cards · 1 drill
Por que cai
Spark é o motor por trás de quase todo pipeline moderno, incluindo o Databricks que o banco usa. A banca não quer a definição de marketing: quer que você descreva o que cada processo faz e o que acontece de verdade entre a linha de código e o resultado.
Pré-teste · 1 de 2
responda antes de verVocê executa df.filter(...).select(...) e nada acontece. Por quê?
Vídeo · português · 15 min
Em uma frase
Spark é um motor de processamento distribuído que divide o dado em partições, monta um plano antes de executar e processa em paralelo num cluster, encadeando etapas em memória em vez de gravar cada uma em disco.
Por que ele substituiu o MapReduce
O MapReduce resolveu o problema de processar dado em muitas máquinas comuns, mas com um custo estrutural: cada etapa grava o resultado em disco. Um pipeline de cinco etapas paga cinco idas e voltas ao HDFS. Em carga iterativa — treino de modelo, recálculo de score — isso domina o tempo.
O Spark encadeia operações dentro de um mesmo estágio sem materializar em disco, e
só grava quando é obrigado. Some a isso duas coisas: uma API muito mais expressiva
que escrever map e reduce à mão, e o fato de montar o plano inteiro antes de
executar, o que abre espaço para otimização.
Arquitetura: quem faz o quê
| Componente | Onde roda | Responsabilidade |
|---|---|---|
| Driver | Processo da sua aplicação | Mantém a SparkSession, converte o código em DAG, divide em stages e tasks, agenda nos executores e recebe o resultado das ações |
| Cluster manager | Serviço externo (standalone, YARN, Kubernetes) | Aloca recursos: quantos executores, com quanta memória e quantos núcleos |
| Executor | Nós de trabalho | Roda as tasks sobre as partições, mantém cache e grava a saída de shuffle |
Repare que o driver não processa dado. Ele coordena. Quando você chama
collect(), aí sim o dado vem para ele — e é por isso que essa ação derruba
aplicação.
Lazy evaluation
transformação— Operação que devolve outro conjunto distribuído e apenas acrescenta um nó ao plano: filter, select, join, groupBy. ação— Operação que devolve um valor ao driver ou escreve num destino, e por isso dispara a execução: count, collect, show, write.Você pode encadear vinte transformações e não ver nada acontecer. Isso é proposital. Com o plano completo em mãos, o otimizador consegue empurrar filtros para perto da leitura, descartar colunas que ninguém usa e combinar operações.
Um efeito colateral que você deve saber citar: erro de transformação aparece na
ação. O rastreamento de pilha aponta a linha do count(), não a do join
errado — saber disso poupa horas de depuração.
DAG, job, stage e task
- 1Ação chamada: o driver fecha o plano lógico e o otimizador gera o plano físico.
- 2Job: cada ação dispara um job.
- 3DAG: o job vira um grafo acíclico dirigido de operações.
- 4Stage: o DAG é cortado nos pontos de shuffle. Sem shuffle, tudo cabe num stage só.
- 5Task: cada stage vira N tasks, uma por partição, e é isso que roda no executor.
A fronteira do stage é o shuffle porque, enquanto cada partição pode ser
processada isoladamente, o Spark encadeia tudo sem parar. No momento em que o
groupBy exige que todas as transações do mesmo cartão fiquem juntas, o estágio
anterior precisa terminar e gravar sua saída antes de o próximo poder ler.
O que acontece de verdade num .count()
Você chama a ação. O driver fecha e otimiza o plano, monta o DAG e o corta em stages nos pontos de shuffle. Cada stage vira tasks, uma por partição. O cluster manager já entregou os executores; o driver agenda as tasks neles. Os executores leem suas partições, aplicam as operações e, se houver shuffle, gravam a saída para o estágio seguinte. No último estágio cada task devolve uma contagem parcial, o driver soma e imprime um número.
O detalhe que impressiona: o único dado que volta ao driver é esse número. Foi o cluster inteiro que trabalhou, e a resposta cabe num inteiro.
Se quiser outro ângulo
Como cai na sabatina
“O que acontece quando você chama .count()?”
Erros comuns
- Dizer que Spark é rápido porque 'roda em memória', sem explicar o quê. O ganho é não gravar o resultado intermediário de cada etapa em disco, como o MapReduce fazia entre map e reduce.
- Achar que Spark carrega a base inteira na RAM. Ele processa por partição e derrama para disco quando não cabe; memória é otimização, não requisito.
- Confundir driver com nó mestre do cluster. O driver é o processo da sua aplicação, que monta o plano e agenda tasks; o cluster manager é quem aloca recursos, e pode ser YARN, Kubernetes ou o standalone.
- Não saber dizer o que uma transformação faz. Transformação não executa nada: ela acrescenta um nó ao plano. Só a ação dispara execução.
- Trazer resultado para o driver sem pensar. collect() puxa todas as partições para a memória de um único processo, e é assim que se derruba o driver com uma tabela de bilhões de linhas.
- Não relacionar shuffle com stage. A fronteira de stage é definida pelo shuffle: enquanto os dados não precisam ser redistribuídos entre executores, tudo cabe no mesmo stage.
Flashcards
Card 1 de 12
0 certos · 0 a reverDrill
Transformação ou ação?
Diga se a operação apenas monta plano (transformação) ou dispara execução (ação).
1.df.filter(col('valor') > 1000)
2.df.count()
3.df.groupBy('id_cartao').sum('valor')
4.df.write.parquet('/lake/bronze/transacoes')
5.df.show(20)
6.df.withColumn('mes', month(col('data')))
Quiz · 1 de 2
Qual é a função do cluster manager numa aplicação Spark?
Explique para um gerente
Explique para um gestor por que o Spark ficou mais rápido que o Hadoop sem que o disco tenha ficado mais rápido.
Responda em voz alta antes de seguir. Se travar numa palavra técnica, é sinal de que ainda não entendeu essa parte.
Perguntas de sabatina deste tema
- · O que acontece, do começo ao fim, quando você chama .count() num DataFrame que passou por filtros e um groupBy?
- · Explique a arquitetura do Spark e por que ele substituiu o MapReduce no processamento em lote.
Para ir além