Apache Spark

Lakehouse

Apresentação

🔥 BLOCO 3 — Apache Spark (guia completo para entrevista)

1️⃣ O que é Apache Spark

Apache Spark é um motor de processamento distribuído de dados usado para processar grandes volumes de dados em clusters.

Permite:

  • ETL pipelines
  • analytics
  • machine learning
  • streaming

Processa dados em memória, o que o torna muito mais rápido que sistemas antigos como Hadoop MapReduce.


2️⃣ Arquitetura do Spark

Arquitetura base:

Driver
   ↓
Cluster Manager
   ↓
Executors
   ↓
Tasks

Driver

Responsável por:

  • criar o SparkSession
  • planear o job
  • dividir o trabalho em tasks
  • coordenar executors

Executors

São os workers que executam o processamento.

Cada executor:

  • corre numa máquina do cluster
  • executa tasks
  • processa partições de dados

Tasks

Unidade mínima de trabalho.

Uma task processa uma partição de dados.


3️⃣ SparkSession

É o ponto de entrada do Spark.

Exemplo:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("example") \
    .getOrCreate()

A partir daqui podes:

  • ler dados
  • transformar dados
  • escrever dados

4️⃣ DataFrames (estrutura principal)

Spark trabalha sobretudo com DataFrames.

Parecido com Pandas mas distribuído.

Exemplo:

df = spark.read.parquet("data/")

Operações comuns:

  • df.select("name")
  • df.filter(df.age > 18)
  • df.groupBy("country").count()

5️⃣ Lazy Evaluation (conceito essencial)

Spark não executa operações imediatamente.

Ele constrói um plano de execução e só executa quando encontra uma action.

Exemplo:

df = spark.read.parquet("data")
df2 = df.filter(df.age > 18)
df2.select("name")

Nada executa ainda.

Executa apenas quando:

  • df2.show()
  • ou df2.count()

6️⃣ Transformations vs Actions

Transformations

Criam um novo DataFrame.

Exemplos: filter, select, map, join, groupBy

São lazy.

Actions

Executam o plano.

Exemplos: show, count, collect, write


7️⃣ Partitions (muito importante)

Spark divide dados em partições.

Cada partição pode ser processada em paralelo.

Exemplo:

dataset
   ↓
partition 1 | partition 2 | partition 3 | partition 4

Mais partições → mais paralelismo.

Mas muitas partições → overhead.

Repartition

Redistribui dados.

df = df.repartition(10)

Coalesce

Reduz partições.

df = df.coalesce(2)

Mais eficiente que repartition para reduzir.


8️⃣ Shuffles

Shuffle acontece quando dados precisam de ser redistribuídos entre executors.

Exemplo: groupBy, join, orderBy

Problema:

  • caro
  • envolve rede
  • pode causar lentidão

9️⃣ Joins no Spark

Tipos principais: inner, left, right, full

Problema comum: Data Skew

Quando uma chave tem muitos dados.

Exemplo: country = "USA"

Solução: salting, repartition

Broadcast Join

Quando uma tabela é pequena.

Spark envia essa tabela para todos os executors.

Muito mais rápido.

Exemplo:

from pyspark.sql.functions import broadcast

df.join(broadcast(df_small), "id")

🔟 Small File Problem

Problema clássico em data lakes.

Muitos ficheiros pequenos: 100k files of 1KB

Problema:

  • overhead de metadata
  • queries lentas

Solução:

  • compaction
  • optimize jobs
  • bigger file sizes

Spark gosta de ficheiros entre: 128MB – 1GB


1️⃣1️⃣ Formats usados com Spark

Parquet

Formato columnar.

Benefícios: compressão, leitura eficiente

Delta Lake

Extensão do Parquet que permite:

  • ACID transactions
  • time travel
  • schema enforcement

Muito usado em Lakehouse.


1️⃣2️⃣ Otimizações importantes

Predicate Pushdown

Spark lê apenas dados necessários.

Partition pruning

Se dados estão particionados por data: date=2026-03-01

Query: WHERE date='2026-03-01'

Spark lê apenas essa partição.


🧠 O que tens de saber explicar bem

Em entrevista:

  • o que é Spark
  • como funciona lazy execution
  • transformations vs actions
  • o que são partitions
  • o que é shuffle
  • como otimizar joins
  • small files problem

Se souberes isto já és considerado sólido em Spark.


🎯 10 perguntas que podem sair numa entrevista

  1. O que é Apache Spark?
  2. Qual a diferença entre transformation e action?
  3. O que é lazy evaluation no Spark?
  4. O que são partitions e porque são importantes?
  5. O que acontece durante um shuffle?
  6. Porque é que joins podem ser lentos em Spark?
  7. O que é um broadcast join?
  8. O que é o small file problem?
  9. Como melhorarias a performance de um job Spark lento?
  10. Qual a diferença entre repartition e coalesce?

Perguntas

Sem perguntas. Clica em Editar para adicionar.