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:

  1. Detener la aplicación EMR Serverless (StopApplication)
  2. Modificar la configuración en la consola, CLI o API
  3. Reiniciar la aplicación (StartApplication)
  4. 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:

  1. Modificar la configuración via API, CLI o Terraform
  2. 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:

  1. Maximum Capacity:
– Campos modificables: 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).

  1. Custom Image Settings:
– Campos: 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

  1. 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+.

  1. 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

  1. 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"
     }'
   
  1. 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"
       }
     }'
   
  1. 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"
     }'
   
  1. Verificar en CloudWatch que:
– El trabajo continúa ejecutándose (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

  1. Canary Deployment:
– Aplicar los cambios primero en un subconjunto de aplicaciones (ej: las menos críticas).

– Monitorear métricas en CloudWatch:

JobsFailed (debe mantenerse en 0%)

ApplicationState (debe ser STARTED)

PendingTasks (debe reducirse o mantenerse estable)

  1. Automatizar con Terraform o CloudFormation:
– Definir los parámetros críticos como variables:
     # 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}\"
             }"
     
  1. Documentar cambios:
– Crear runbooks en Confluence o Notion con ejemplos de comandos para:

– 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:
– Umbral: Si 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:
– Filtrar eventos 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:
  1. Actualizar a EMR Serverless 6.15+ o 7.x.
  2. Validar permisos IAM y cuotas de recursos.
  3. Implementar cambios en entornos de prueba antes de producción.
  4. Automatizar con IaC (Terraform/CloudFormation) y monitorear con CloudWatch.

Fuentes

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *