Cómo automatizar la limpieza de archivos en el Data Lake con Azure Synapse Analytics
Automatizar la eliminación de archivos obsoletos en el Data Lake ayuda a controlar costes, mejorar el rendimiento de las operaciones de ingestión e indexación, y mantener la organización. En este tutorial explico por qué seguir un patrón con Azure Synapse Analytics (Synapse Pipelines) para orquestar y una Azure Function para ejecutar la lógica de limpieza es un enfoque práctico y escalable. Daré ejemplos concretos, parámetros típicos y buenas prácticas para evitar eliminar datos por error.
Requisitos previos
- Cuenta Azure con permisos para crear recursos (Synapse workspace, Storage, Function).
- Azure Synapse Analytics workspace con Synapse Pipelines habilitado.
- ADLS Gen2 (Storage account) con un contenedor de datos y algunos prefijos (por ejemplo logs/ o staging/).
- Azure Function App (Consumption o Premium) con identity o clave para eliminar archivos.
- Familiaridad básica con JSON y PowerShell/Python para probar localmente.
Paso 1: Concepto y porqué de la arquitectura
En lugar de realizar operaciones masivas directamente en Synapse (que puede aumentar costes y complejidad), el patrón separa orquestación y ejecución: Synapse Pipelines actúa como scheduler y orquestador; la Azure Function contiene la lógica de listado y eliminación en ADLS Gen2. Ventajas: escalabilidad (la Function puede escalar con la carga), logging y telemetría centralizados, reutilización de la Function por otros pipelines y menor superficie de riesgo en la eliminación de archivos.
Ejemplo concreto: en una empresa que acumula 100k archivos pequeños por mes, eliminar archivos con más de 90 días puede reducir una sobrecarga de lectura/listado y costes operativos. Adicionalmente, un pipeline diario que compruebe un prefijo con 10k archivos suele completarse en menos de 5 minutos con la Function, dependiendo del tamaño y de la latencia de la cuenta de almacenamiento.
Paso 2: Crear la Azure Function para eliminar archivos antiguos
La Function recibe parámetros (container, prefix, edad en días, modo_preview) y elimina archivos con lastModified anterior a la fecha límite. Aquí hay un ejemplo robusto en Python (usa azure-storage-blob), que incluye logging, un modo preview para no eliminar nada durante pruebas y retorno con un recuento limitado para evitar payloads muy grandes.
import os
import logging
from datetime import datetime, timezone, timedelta
from azure.storage.blob import ContainerClient
conn_str = os.environ.get('AZURE_STORAGE_CONNECTION_STRING')
def main(req):
data = req.get_json()
container = data.get('container')
prefix = data.get('prefix','')
days = int(data.get('days',30))
preview = bool(data.get('preview',True))
client = ContainerClient.from_connection_string(conn_str, container)
cutoff = datetime.now(timezone.utc) - timedelta(days=days)
deleted = []
for blob in client.list_blobs(name_starts_with=prefix):
try:
if blob.last_modified and blob.last_modified < cutoff:
logging.info(f"Candidate: {blob.name} last_modified={blob.last_modified}")
if not preview:
client.get_blob_client(blob).delete_blob()
deleted.append(blob.name)
else:
# preview mode: apenas registar
deleted.append(f"PREVIEW:{blob.name}")
except Exception as e:
logging.error(f"Erro a processar {blob.name}: {e}")
return {
'status': 200,
'deleted_count': len([d for d in deleted if not str(d).startswith('PREVIEW')]),
'preview': preview,
'sample': deleted[:50]
}
Paso 3: Habilitar autenticación y acceso a ADLS Gen2
Tienes dos opciones principales: usar AZURE_STORAGE_CONNECTION_STRING en los Application Settings de la Function (rápido para dev) o asignar una Managed Identity y usar RBAC (recomendado para producción). Para entornos críticos, crea una Managed Identity para la Function y asigna la role "Storage Blob Data Contributor" a nivel del contenedor o de la cuenta de storage. Esto evita exponer claves y facilita la rotación de credenciales.
Ejemplo: en una política de seguridad, concede la role solo al contenedor de destino; en alternativa, usa políticas más restrictivas como Azure AD + ACLs POSIX si necesitas control por archivo.
Paso 4: Crear un Synapse Pipeline que llame a la Function
En Synapse Studio crea un Pipeline con un Web Activity que hace POST a la URL de la Function. Pasa los parámetros JSON (container, prefix, days, preview). Esto permite programar, monitorizar ejecuciones e integrar condiciones antes y después de la limpieza.
{
"method": "POST",
"url": "https://.azurewebsites.net/api/",
"headers": {
"Content-Type": "application/json"
},
"body": {
"container": "dados",
"prefix": "logs/",
"days": 90,
"preview": true
}
}
Paso 5: Añadir lógica de reintento y notificación
Configura en el Web Activity propiedades de retry (ej.: 3 intentos con 30 s entre cada uno) y timeout (por ejemplo 5 m). Usa una Activity "If Condition" para evaluar el campo deleted_count en el output y, en caso de valores superiores a un umbral (ej.: >1000), encamina a una Logic App que notifique al equipo vía e-mail o Teams. En errores, registra la ejecución y envía alertas automáticas.
Paso 6: Programar y probar el Pipeline
Usa un Trigger de schedule en el Synapse Pipeline (ej.: diario a las 02:00). Ejecuta pruebas con preview=true y days=1 en un prefijo de desarrollo para confirmar el comportamiento. Después, haz una prueba controlada con preview=false en un prefijo de staging y límite de días (por ejemplo 180) antes de aplicar en producción. Verifica siempre los logs de la Azure Function y los detalles del run en Synapse para confirmar deleted_count y sample.
Verificar el resultado
Confirma en Storage Explorer o en el portal de la Storage account que los archivos con lastModified anteriores al cutoff fueron eliminados. En el Synapse Pipeline revisa los run details del Web Activity: debe devolver deleted_count, flag preview y una lista de muestra. Consulta también Application Insights (si está configurado) para métricas de latencia y errores.
Conclusión
Este patrón con Synapse Pipelines orquestando una Azure Function es sencillo, reutilizable y permite automatizar la limpieza del Data Lake con seguridad. En producción, se recomienda usar Managed Identity, instrumentar con Application Insights y empezar con modo preview y límites progresivos. Consejo final: mantén siempre un prefijo de dev y un proceso de validación antes de aplicar reglas a datos críticos para no correr el riesgo de pérdida accidental.