Introducción
Hasta hace poco, ajustar parámetros críticos en Amazon EMR Serverless requería un reinicio completo de la aplicación. Esto obligaba a planificar ventanas de mantenimiento, bloquear envíos de trabajos y asumir riesgos operativos. En entornos de big data con SLAs estrictos, cada minuto de indisponibilidad se traduce en costos directos e incumplimiento de acuerdos.
La nueva capacidad de aplicar actualizaciones en caliente (live configuration updates) permite modificar parámetros como:
- Capacidad máxima de cómputo (vCPU, memoria)
- Configuraciones de imágenes personalizadas (custom images)
- Límites de escalado automático
Sin interrumpir trabajos en ejecución ni forzar reinicios manuales. Esto no solo elimina la necesidad de coordinar ventanas de mantenimiento, sino que también habilita respuestas inmediatas a cambios en la demanda de carga o actualizaciones de imágenes con parches de seguridad críticos.
Qué ocurrió
AWS anunció el soporte nativo para actualizaciones en caliente en Amazon EMR Serverless el 4 de junio de 2024, según el anuncio oficial en AWS What’s New. La funcionalidad está disponible en:
- Todas las versiones de EMR Serverless (incluyendo las más recientes como EMR 6.15+ y EMR 7.x)
- Todas las regiones donde EMR Serverless está disponible (us-east-1, eu-west-1, ap-southeast-1, etc.)
Antes de este cambio, los equipos debían:
- Detener la aplicación EMR Serverless (
StopApplication) - Modificar la configuración en la consola, CLI o API
- Reiniciar la aplicación (
StartApplication) - Verificar que los trabajos en cola se reanudaran correctamente
Este proceso podía tomar entre 5 y 15 minutos según el tamaño del clúster, y durante ese tiempo:
- Los trabajos nuevos quedaban en cola (
PENDING) - Los trabajos en ejecución continuaban, pero no había capacidad disponible para nuevas tareas
- Se generaban alertas en herramientas como CloudWatch por indisponibilidad
Con las actualizaciones en caliente, estos pasos se reducen a:
- Modificar la configuración via API, CLI o Terraform
- Verificar que los cambios se apliquen en segundos
Impacto para DevOps / Infraestructura / Cloud / Seguridad
Para equipos de DevOps
La reducción de ventanas de mantenimiento tiene un impacto directo en la disponibilidad de pipelines:
- MTTR (Mean Time To Recovery): Se elimina el tiempo de reinicio, pasando de minutos a segundos.
- Automatización: Permite integrar cambios de configuración en CI/CD sin requerir pasos manuales de stop/start.
- Escalabilidad: Ajustar límites de capacidad máxima sin afectar trabajos en ejecución evita cuellos de botella en picos de carga.
Ejemplo práctico:
Si un trabajo de Spark procesa 10TB diarios con un pico nocturno que requiere escalar de 200 a 500 vCPUs, antes había que:
- Planificar una ventana de 10 minutos
- Bloquear envíos durante el reinicio
- Riesgo de fallos en el reinicio (ej:
EMR.Applications.StartFailure)
Ahora:
- Se ajusta el límite máximo via CLI:
aws emr-serverless update-application \
--application-id app-xxxxxx \
--maximum-capacity-configuration '{
"Cpu": "500 vCPU",
"Memory": "1600 GB"
}'
- Los nuevos pods de Spark usan los límites actualizados en segundos.
Para equipos de Cloud
- Costos: Menos tiempo de indisponibilidad = menos tiempo de cómputo desperdiciado en trabajos que no progresan.
- Resiliencia: Permite aplicar parches de seguridad en imágenes personalizadas sin downtime. Por ejemplo, si una imagen de EMR Serverless tiene una CVE reportada (como CVE-2024-21626 en una librería de Java, se puede actualizar la imagen y aplicar los cambios en segundos.
Para equipos de Seguridad
- Tiempo de exposición a vulnerabilidades: Se reduce de horas/días (tiempo de reinicio + planificación) a minutos.
- Auditoría: Los cambios quedan registrados en AWS CloudTrail como
UpdateApplication, con detalles de qué parámetros se modificaron y quién los aplicó.
Detalles técnicos
Componentes afectados
- EMR Serverless Application: La unidad lógica que ejecuta trabajos de Spark, Hive, etc.
- Custom Images: Imágenes de Docker personalizadas para EMR Serverless (basadas en Amazon Linux 2 o imágenes propias con componentes como Spark 3.5.0).
- Maximum Capacity Configuration: Parámetro que define el techo de recursos (vCPU, memoria) que puede asignar EMR Serverless.
Vectores de cambio
Los parámetros que ahora soportan actualizaciones en caliente son:
- Maximum Capacity:
Cpu, Memory– Ejemplo de payload en API:
{
"maximumCapacityConfiguration": {
"cpu": "300 vCPU",
"memory": "1200 GB"
}
}
– Límites: El aumento de capacidad debe respetar los límites de la cuenta AWS (por ejemplo, cuotas de vCPU por región).
- Custom Image Settings:
ImageConfiguration, ImageId– Ejemplo:
aws emr-serverless update-application \
--application-id app-xxxxxx \
--image-configuration '{
"imageId": "emr-7.2.0-custom-image-20240604"
}'
– Requiere que la imagen esté previamente subida a Amazon ECR o EMR Custom Images.
Comportamiento durante el cambio
- Trabajos nuevos: Usan la nueva configuración inmediatamente tras el cambio.
- Trabajos en ejecución: Continúan con su configuración original hasta completarse.
- Escalado: Si un trabajo en ejecución necesita más recursos que los disponibles en la configuración anterior, EMR Serverless no podra asignar más capacidad hasta que el trabajo termine o se ajuste manualmente.
Requisitos previos
- Versión mínima de EMR Serverless: Todas las versiones soportadas (EMR 6.15+ y EMR 7.x).
- Permisos IAM: El rol de ejecución de la aplicación debe tener:
{
"Effect": "Allow",
"Action": [
"emr-serverless:UpdateApplication"
],
"Resource": "arn:aws:emr-serverless:*:*:application/*"
}
- Regiones soportadas: Todas donde EMR Serverless esté disponible (consultar lista oficial).
Qué deberían hacer los administradores y equipos técnicos
Paso 1: Validar compatibilidad con tu entorno
- Verificar la versión de EMR Serverless en uso:
aws emr-serverless list-applications \
--query 'applications[?state==`STARTED`].id' \
--output text
– Si usas EMR 6.14 o anterior, deberás actualizar al menos a EMR 6.15+.
- Confirmar que tu cuenta tenga cuotas suficientes para el nuevo límite de capacidad:
aws service-quotas list-service-quotas \
--service-code "emr-serverless"
Paso 2: Actualizar permisos IAM
Asegurar que los roles de ejecución (por ejemplo, EMRServerlessDefaultRole) tengan el permiso emr-serverless:UpdateApplication. Si usas Terraform:
resource "aws_iam_role_policy" "emr_serverless_update" {
name = "EMRServerlessUpdateApplicationPolicy"
role = aws_iam_role.emr_serverless_execution.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["emr-serverless:UpdateApplication"]
Resource = "arn:aws:emr-serverless:*:*:application/*"
}]
})
}Paso 3: Probar el flujo en un entorno no productivo
- Crear una aplicación de prueba:
aws emr-serverless create-application \
--name "test-live-update" \
--release-label "emr-7.2.0" \
--initial-capacity-configuration '{
"cpu": "100 vCPU",
"memory": "400 GB"
}'
- Enviar un trabajo de ejemplo (ej: un SparkPi de 1000 iteraciones):
aws emr-serverless start-job-run \
--application-id app-xxxxxx \
--execution-role-role-arn arn:aws:iam::123456789012:role/EMRServerlessDefaultRole \
--job-driver '{
"sparkSubmit": {
"entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar",
"entryPointArguments": ["1000"],
"sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
}
}'
- Modificar la capacidad máxima mientras el trabajo está en ejecución:
aws emr-serverless update-application \
--application-id app-xxxxxx \
--maximum-capacity-configuration '{
"cpu": "200 vCPU",
"memory": "800 GB"
}'
- Verificar en CloudWatch que:
state: RUNNING)– La capacidad máxima se actualizó (métrica MaximumCapacity en el dashboard de EMR Serverless)
Paso 4: Implementar en producción con rollout gradual
- Canary Deployment:
– Monitorear métricas en CloudWatch:
– JobsFailed (debe mantenerse en 0%)
– ApplicationState (debe ser STARTED)
– PendingTasks (debe reducirse o mantenerse estable)
- Automatizar con Terraform o CloudFormation:
# variables.tf
variable "emr_max_cpu" {
description = "Capacidad máxima de CPU para EMR Serverless"
type = string
default = "500 vCPU"
}
– Aplicar los cambios via pipeline de CI/CD:
# .gitlab-ci.yml
update-emr-capacity:
script:
- aws emr-serverless update-application \
--application-id $EMR_APP_ID \
--maximum-capacity-configuration "{
\"cpu\": \"${EMR_MAX_CPU}\",
\"memory\": \"${EMR_MAX_MEMORY}\"
}"
- Documentar cambios:
– Aumentar capacidad en picos de carga
– Aplicar parches de seguridad en imágenes personalizadas
– Revertir cambios si hay errores
Paso 5: Monitoreo post-implementación
- Alertas en CloudWatch:
PendingTasks > 10% del promedio histórico, disparar alerta a Slack/Teams.– Métrica: MaximumCapacity debe reflejar los cambios en menos de 1 minuto.
- Logs en CloudTrail:
UpdateApplication para auditoría: -- Consulta en Athena para CloudTrail
SELECT
eventTime,
userIdentity.principalId,
requestParameters.applicationId,
requestParameters.maximumCapacityConfiguration
FROM cloudtrail_logs
WHERE eventName = 'UpdateApplication'
ORDER BY eventTime DESC
LIMIT 100;
Conclusión
Las actualizaciones en caliente de Amazon EMR Serverless marcan un antes y después en la gestión de clústeres serverless. Eliminar la necesidad de reinicios no solo simplifica operaciones, sino que también reduce costos y mejora la resiliencia de pipelines de datos críticos.
Para equipos de DevOps, esto significa:
✅ Menos coordinación de ventanas de mantenimiento
✅ Integración nativa con CI/CD para cambios de configuración
✅ Respuesta inmediata a picos de carga o vulnerabilidades
Para equipos de Seguridad:
✅ Reducción del tiempo de exposición a CVEs
✅ Auditoria granular de cambios vía CloudTrail
Recomendación final:- Actualizar a EMR Serverless 6.15+ o 7.x.
- Validar permisos IAM y cuotas de recursos.
- Implementar cambios en entornos de prueba antes de producción.
- Automatizar con IaC (Terraform/CloudFormation) y monitorear con CloudWatch.
Fuentes
- AWS What’s New: Amazon EMR Serverless ahora soporta actualizaciones en caliente
- Documentación oficial de EMR Serverless
- Lista de regiones soportadas por EMR Serverless
- Guía de Service Quotas para EMR