¿Qué hace Diseño de Backfills y Reproducciones?
Cuándo usarlo
- Cargar historial para un nuevo modelo/pipeline.
- Reprocesar ventanas pasadas después de corregir un error de transformación.
- Reproducir eventos o re-derivar una tabla desde datos crudos.
- NO lo use para ejecuciones incrementales normales (use
building-dbt-models/authoring-airflow-dags).
Por qué merece cuidado
Los backfills son la operación rutinaria más peligrosa en ingeniería de datos: reescriben el historial. Si se hacen mal, duplican conteos, cambian los números de ayer o sobrecargan la producción. Si se hacen bien, son aburridos y repetibles. El requisito previo es la idempotencia (consulte writing-idempotent-transformations).
Flujo de trabajo
- [ ] Confirmar que la transformación es idempotente (re-ejecutar == ejecutar una vez) ANTES del backfill
- [ ] Definir la ventana exacta y la granularidad de la partición
- [ ] Ejecución de prueba en una partición; verificar conteos/sumas vs fuente
- [ ] Ejecutar partición por partición (paralelismo acotado), no todo de una vez
- [ ] Aislar el cómputo del backfill de las cargas de trabajo de producción
- [ ] Verificar totales y conciliar; luego reanudar la programación normal
- Pruebe la idempotencia primero. Si re-ejecutar una ventana puede cambiar los resultados, arregle eso antes de tocar el historial. Hacer backfill de un trabajo no idempotente multiplica los datos.
- Defina el alcance precisamente. Fecha/hora exacta de inicio y fin, y la unidad de partición (día/hora/región).
- Ejecución de prueba en una partición y concilie contra la fuente antes de escalar.
- Divida la ejecución. Procese las particiones en lotes acotados para poder monitorear, pausar y reanudar — nunca un trabajo gigante sin límites.
- Aísle el cómputo. Use un almacén/clúster/pool separado para que el backfill no perjudique los SLA de producción.
- Verifique + reanude. Concilie los totales en el rango del backfill, luego devuelva el control a la programación normal.
Patrones
Backfill idempotente por partición — cada sobrescritura de partición es independiente y segura de reintentar:
# Paralelismo acotado, un día a la vez; cada día sobrescribe su propia partición.
for day in $(seq_dates 2026-01-01 2026-01-31); do
run_transform --run-date "$day" # delete-insert / MERGE para ese día solamente
done
Airflow — catchup/backfill re-ejecuta intervalos; solo es seguro cuando las tareas son idempotentes y están parametrizadas por el intervalo de datos. dbt — filtre el modelo incremental a la ventana objetivo, o --full-refresh una ventana acotada.
Aislar + limitar — almacén/clúster dedicado y un límite de concurrencia para que el backfill no degrade paneles de control en vivo.
Errores comunes
- Hacer backfill de un trabajo no idempotente — duplicados o totales cambiantes; hágalo idempotente primero.
- Una ejecución gigante sin límites — no se puede monitorear ni reanudar, y sobrecarga la producción; vaya partición por partición.
- Compartir cómputo de producción — los backfills generan picos de carga y rompen SLA; aísle.
- Sin verificación — asumir éxito; concilie conteos/sumas en el rango.
- Cambiar la lógica a mitad del backfill — historial inconsistente; fije la versión del código para toda la ejecución.
- Olvidar aguas abajo — hacer backfill de una tabla base sin refrescar tablas de resumen/agregados dependientes los deja inconsistentes.