Como criar e gerir checkpoints em Apache Spark: passo a passo
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?