Cómo crear y gestionar checkpoints en Apache Spark: paso a paso
Este tutorial explica cómo crear y gestionar checkpoints en Apache Spark, una técnica útil para garantizar la recuperación ante fallos en trabajos largos y en streaming. Saber configurar checkpoints reduce la pérdida de trabajo y permite retomar el procesamiento con estado consistente.
Requisitos previos
- Instalación de Apache Spark y Python con PySpark configurado.
- Conocimientos básicos de DataFrame y operaciones en Spark.
- Acceso a un sistema de ficheros persistente (local o HDFS/ADLS/S3) para guardar checkpoints.
Paso 1: Entender qué es un checkpoint y cuándo usarlo
Checkpoint es guardar una versión materializada de un RDD/DataFrame (o el estado de una aplicación de streaming) en un sistema de ficheros para recuperación. Usa checkpoint para: evitar reconstrucciones largas del lineage, mantener estado en Structured Streaming, o garantizar consistencia tras fallos.
Paso 2: Configurar directorio de checkpoint
Elige un directorio persistente que sobreviva a fallos de ejecutores. Para producción, usa HDFS, S3 o ADLS. En entorno local, utiliza una ruta absoluta.
# 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)
Paso 3: Checkpoint en RDDs para recortar el lineage
Cuando un RDD tiene una cadena de dependencias larga, hacer checkpoint almacena una copia en disco y limpia el lineage, acelerando las recomputaciones.
# 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
Paso 4: Checkpoint en Structured Streaming
En Structured Streaming, el checkpoint es obligatorio para usar estado y para recuperar offsets en caso de fallo. Define checkpointLocation en el 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()
Paso 5: Recuperar desde un checkpoint
Para Structured Streaming, basta iniciar la query con el mismo checkpointLocation y el motor recupera offsets y estado. Para RDD/DataFrame, es necesario cargar desde el fichero materializado si hace falta 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-*")
Paso 6: Buenas prácticas y errores comunes
Buenas prácticas: usa directorios persistentes con permisos correctos, no mezcles checkpoints de varias aplicaciones en el mismo directorio, monitoriza el espacio en disco. Errores comunes incluyen: checkpointLocation inaccesible (permisos/endpoint), usar un directorio temporal no compartido en el cluster, y olvidar reiniciar el streaming con el mismo checkpointLocation.
Verificar el resultado
Confirma que el checkpoint ha funcionado: para RDD revisa los ficheros creados en checkpoint_dir; para Structured Streaming verifica que, tras parar y reiniciar la aplicación con el mismo checkpointLocation, la aplicación retoma sin reprocesar datos ya confirmados y sin perder estado. Consulta los logs para mensajes sobre restauración de estado y offsets.
Conclusión
Checkpoint en Apache Spark es esencial para fiabilidad en trabajos largos y para mantener estado en streaming. Próximos pasos: experimenta con checkpoints en S3/HDFS y combínalos con guardar estado en sinks idempotentes. Consejo: prueba la recuperación en una pequeña falla controlada para validar el comportamiento antes de ir a producción — ¿ya has probado la recuperación de tu aplicación?