Costo
Nivel medio¿Cómo reduzco mi factura de Databricks/EMR/Glue sin romper nada?
No todas las palancas de costo cargan el mismo riesgo. Este es el orden que te da ahorros reales antes de tocar algo que podría realmente romper un pipeline.
Las facturas de infraestructura de datos en la nube rara vez suben por un gran error — se acumulan a partir de una docena de pequeños que eran razonables en su momento y nunca se revisaron. La buena noticia: la mayoría de los arreglos baratos también son los seguros.
Riesgo bajo, hazlos primero
- Ajusta el número de instancias según la utilización real, no el pico para el que aprovisionaste una vez. Si la utilización promedio de CPU entre los executors de un job está por debajo del 40%, muy probablemente estás sobreaprovisionado — esto es casi gratis porque no cambia la lógica del job en absoluto.
- Activa el autoescalado si no lo has hecho. Un tamaño de clúster fijo significa pagar la capacidad pico las 24 horas. La mayoría de las plataformas Spark gestionadas (Databricks, EMR) lo soportan de forma nativa con configuración mínima.
- Mueve las cargas batch elegibles a instancias spot/preemptible. Un job batch reintentable y con checkpoints (no un job de streaming stateful de larga duración) suele ser un buen candidato, a menudo con 60-90% de descuento sobre el precio on-demand.
Riesgo medio, prueba primero
- Reduce el número de shuffle partitions si está configurado con margen defensivo excesivo. Menos particiones, más grandes, significa menos overhead de programación de tareas, pero ir demasiado lejos reintroduce los problemas de presión de memoria que ese número alto probablemente buscaba evitar — verifica contra el tiempo de GC y los bytes de spill después de cambiar, no solo el tiempo total.
- Consolida jobs pequeños y frecuentes en menos corridas, más grandes. El tiempo de arranque/calentamiento del clúster es overhead fijo que se paga en cada corrida; un job que corre cada 5 minutos paga ese overhead 12 veces más seguido que el mismo trabajo agrupado por hora.
Riesgo más alto, necesita validación real
- Cambiar de familia de instancia (por ejemplo, de optimizada para memoria a propósito general) cambia la proporción memoria-por-núcleo contra la que tu job estaba implícitamente ajustado — una victoria de costo en el papel puede convertirse en una regresión de rendimiento u OOM en la práctica.
- Cambios agresivos de TTL/lifecycle en almacenamiento intermedio ahorran en almacenamiento pero pueden romper silenciosamente cualquier cosa río abajo que asumiera que esos datos seguirían ahí.
Por qué importa este orden: el nivel de "riesgo bajo" de arriba es donde se enfocan primero las reglas de opti-pipe — número de instancias y shuffle partitions dimensionados según tu utilización realmente medida, mostrados como una recomendación específica con una estimación real en dólares, no un porcentaje que tú mismo tienes que traducir a costo. Cada sugerencia es algo que apruebas, no algo que se aplica solo.
Mira cómo se ve esto en tu propio pipeline.
Sube un event log real de Spark, un run_results.json de dbt, o una exportación de métricas de Flink, y recibe recomendaciones concretas para aprobar — no otra regla general más.