(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar e gerir checkpoints em Apache Spark: passo a passo

João Barros 23 de October de 2026 4 min de leitura

Este tutorial explica como criar e gerir checkpoints em Apache Spark, uma técnica útil para garantir a recuperação de falhas em trabalhos longos e em streaming. Saber configurar checkpoints reduz a perda de trabalho e permite retomar o processamento com estado consistente.

Pré-requisitos

  • Instalação do Apache Spark e Python com PySpark configurado.
  • Conhecimentos básicos de DataFrame e operações em Spark.
  • Acesso a um sistema de ficheiros persistente (local ou HDFS/ADLS/S3) para guardar checkpoints.

Passo 1: Entender o que é um checkpoint e quando usar

Checkpoint é guardar uma versão materializada de um RDD/DataFrame (ou o estado de uma aplicação de streaming) num sistema de ficheiros para recuperação. Use checkpoint para: evitar reconstruções longas do lineage, manter estado em Structured Streaming, ou garantir consistência após falhas.

Passo 2: Configurar diretório de checkpoint

Escolha um diretório persistente que sobreviva a falhas de executores. Para produção, use HDFS, S3 ou ADLS. Em ambiente local, utilize um caminho absoluto.

# Exemplo PySpark: definir diretório global de checkpoint
from pyspark.sql import SparkSession

spark = SparkSession.builder 
    .appName("checkpoint-demo") 
    .getOrCreate()

# Defina um diretório no sistema de ficheiros acessível por todos os nós
checkpoint_dir = "/tmp/spark_checkpoints/my_app"
spark.sparkContext.setCheckpointDir(checkpoint_dir)

Passo 3: Checkpoint em RDDs para cortar lineage

Quando um RDD tem uma cadeia de dependências longa, fazer checkpoint armazena uma cópia no disco e limpa o lineage, acelerando recomputações.

# Criar RDD e fazer checkpoint
rdd = spark.sparkContext.parallelize(range(1000000)).map(lambda x: x * 2)
rdd = rdd.map(lambda x: x + 1)

# Marcar para checkpoint e forçar execução
rdd.checkpoint()
rdd.count()  # ação que força materialização do checkpoint

Passo 4: Checkpoint em Structured Streaming

Em Structured Streaming, o checkpoint é obrigatório para utilizar estado e para recuperar offsets em caso de falha. Defina checkpointLocation no writeStream.

from pyspark.sql.functions import expr

# Exemplo simples de streaming de ficheiros CSV
input_path = "/path/to/input/csvs"
checkpoint_path = "/tmp/spark_checkpoints/stream_app"

stream_df = spark.readStream \
    .option("header", "true") \
    .csv(input_path)

# Operação com estado simples: contagem por coluna
agg = stream_df.groupBy("category").count()

query = agg.writeStream \
    .outputMode("complete") \
    .format("console") \
    .option("checkpointLocation", checkpoint_path) \
    .start()

query.awaitTermination()

Passo 5: Recuperar de um checkpoint

Para Structured Streaming, basta iniciar a query com o mesmo checkpointLocation e o motor recupera offsets e estado. Para RDD/DataFrame, é necessário carregar a partir do ficheiro materializado se for preciso reiniciar manualmente.

# Structured Streaming: reiniciar a mesma query reutiliza o checkpoint
query = agg.writeStream \
    .outputMode("complete") \
    .format("console") \
    .option("checkpointLocation", checkpoint_path) \
    .start()

# RDD: ler ficheiro materializado (exemplo simplificado)
# Se o checkpoint guardou ficheiros parquet, podemos ler diretamente
# spark.read.parquet("/tmp/spark_checkpoints/my_app/part-*")

Passo 6: Boas práticas e erros comuns

Boas práticas: use diretórios persistentes com permissões correctas, não misture checkpoints de várias aplicações no mesmo diretório, monitorize o espaço em disco. Erros comuns incluem: checkpointLocation inacessível (permissões/endpoint), usar um directório temporário não partilhado no cluster, e esquecer de reiniciar o streaming com o mesmo checkpointLocation.

Verificar o resultado

Confirme que o checkpoint funcionou: para RDD veja os ficheiros criados em checkpoint_dir; para Structured Streaming verifique que, após parar e reiniciar a aplicação com o mesmo checkpointLocation, a aplicação retoma sem reprocessar dados já confirmados e sem perder estado. Consulte os logs para mensagens sobre restauração de estado e offsets.

Conclusão

Checkpoint em Apache Spark é essencial para fiabilidade em trabalhos longos e para manter estado em streaming. Próximos passos: experimente com checkpoints em S3/HDFS e combine com salvar estado em sinks idempotentes. Dica: teste a recuperação numa pequena falha controlada para validar o comportamento antes de ir para produção — já testou a recuperação da tua aplicação?