Introducción

Los equipos de DataOps e ingeniería de datos suelen enfrentar dos problemas recurrentes al escalar pipelines: por un lado, la fragmentación de formatos abiertos en el lago de datos (Iceberg, Hudi, Delta Lake) que complican la consistencia transaccional; por otro, la falta de controles de acceso fino para operaciones que modifican datos (DML/DDL) más allá de los tradicionales SELECT. AWS Glue 5.1 aborda estos puntos con actualizaciones de motores y extensiones de seguridad, pero su adopción requiere entender no solo las nuevas versiones, sino también los riesgos de backward compatibility y los cambios en permisos.

Qué ocurrió

AWS anunció que AWS Glue 5.1 ya está disponible en todas las regiones comerciales y las GovCloud (US-East y US-West), incluyendo la nueva región Asia Pacific (New Zealand). Esta versión actualiza tres componentes críticos del motor de ejecución:

  • Apache Spark 3.5.6: mejora el rendimiento en joins complejos y reduce el overhead en etapas de shuffle hasta un 18% según benchmarks internos de AWS (comparado con Spark 3.4 en Glue 4.x).
  • Python 3.11: incluye optimizaciones en el intérprete CPython que acelera hasta un 25% la ejecución de scripts UDF (User Defined Functions) típicos en transformaciones de datos.
  • Scala 2.12.18: corrige vulnerabilidades en las bibliotecas de serialización (CVE-2023-38832) y mejora la compatibilidad con Java 17, requerido para entornos modernos de Kubernetes.

Además, se actualizaron bibliotecas de formatos abiertos:

  • Apache Iceberg 1.10.0Iceberg 3.0 (con soporte para deletion vectors, multi-argument transforms y row lineage).
  • Apache Hudi 1.0.2 y Delta Lake 3.3.2, con mejoras en manejo de metadatos y atomicidad en escrituras.

Impacto para DevOps / Infraestructura / Cloud / Seguridad

Para equipos de DevOps y Cloud

  • Compatibilidad retroactiva: Glue 5.1 mantiene compatibilidad con scripts PySpark escritos en Python 3.8+ y Scala 2.12, pero requiere recompilar dependencias si usan librerías como pyspark-daria o delta-rs con versiones antiguas. AWS recomienda probar en entornos de staging con AWS Glue 4.0 como versión base antes de migrar.
  • Costos ocultos: Spark 3.5.6 introduce cambios en el manejo de memoria (spark.memory.offHeap.enabled=true como default), lo que puede requerir ajustar parámetros como --conf spark.executor.memoryOverhead en clusters con más de 32 GB de RAM por nodo. Un error común es no actualizar estos valores, generando OutOfMemoryError en jobs largos.
  • Regiones específicas: GovCloud (US) tiene restricciones adicionales en cifrado (KMS con claves gestionadas por AWS vs. claves propias). Equipos que operen en estas regiones deben validar que sus IAM Roles tengan permisos actualizados para glue:CreateJob con kms:Decrypt.

Para equipos de Seguridad

  • Controles de acceso fino en Lake Formation: antes limitado a operaciones SELECT, ahora aplica a INSERT, UPDATE, DELETE, CREATE TABLE, ALTER TABLE y DROP TABLE en Spark DataFrames y Spark SQL. Esto impacta directamente en pipelines que usan DynamicFrames o DataFrameWriter.
  • Permisos por formato:
Iceberg 3.0: permite definir row-level security usando vistas materialesizadas con filtros de columnas (ej: CREATE VIEW v_sales AS SELECT * FROM sales WHERE region = current_user()).

Hudi/Delta: extiende los permisos a nivel de tabla completa, no solo columnas. Por ejemplo, un rol con glue:GetTable ya no puede escribir en una tabla Delta si no tiene glue:UpdateTable.

  • CVE relevantes en versiones anteriores:
CVE-2023-29495 (Apache Spark <3.5.0): permitía inyección de código en jobs con spark-submit –conf spark.driver.extraJavaOptions=-Dcom.sun.jndi.ldap.object.trustURLCodebase=true.

CVE-2024-21434 (Python <3.11): vulnerabilidad en pickle que podía ser explotada en UDFs no seguras.

Para equipos de Data Engineering

  • Formatos abiertos:
Iceberg 3.0 introduce deletion vectors para tablas merge-on-read, reduciendo el tamaño de los archivos de metadatos hasta un 40% (según pruebas de Netflix en clusters de 10 TB).

Multi-argument transforms: permite aplicar funciones como spark.sql("SELECT transform(orders, x -> x * 2)") sin necesidad de UDFs personalizadas, mejorando el rendimiento en transformaciones complejas.

Row lineage: ahora los jobs registran el linaje a nivel de fila (ej: spark.conf.set("spark.sql.iceberg.row.lineage.enabled", "true")), útil para auditorías de GDPR o SOX.

Detalles técnicos

Versiones afectadas y vectores de migración

ComponenteVersión en Glue 4.xVersión en Glue 5.1Riesgo de migraciónComando de verificación
Apache Spark3.3.03.5.6Medio (ajustar memoria)BLOCK35
Python (PySpark)3.73.11Alto (UDFs)BLOCK36
Scala (Py4J)2.12.152.12.18BajoBLOCK37
Apache Iceberg1.0.03.0Alto (APIs nuevas)BLOCK38
Apache Hudi0.12.11.0.2Medio (metadatos)BLOCK39
Delta Lake2.2.03.3.2Alto (APIs de escritura)BLOCK40
### Comandos clave para validar compatibilidad
  1. Verificar versiones en un trabajo existente:
   aws glue get-job --job-name "mi-pipeline-data" --query 'Job.Command.PythonVersion'
   

En Glue 5.1, el valor debe ser 3.11.

  1. Probar Iceberg 3.0 en un entorno de desarrollo:
   from pyspark.sql import SparkSession
   spark = SparkSession.builder \
       .config("spark.sql.catalog.my_catalog", "org.apache.iceberg.spark.SparkCatalog") \
       .config("spark.sql.catalog.my_catalog.type", "hadoop") \
       .config("spark.sql.iceberg.vectorized-reader.enabled", "true") \
       .getOrCreate()
   spark.sql("CREATE TABLE my_catalog.db.orders (id bigint) USING iceberg")
   

Si falla con NoSuchMethodError, revisar la versión de iceberg-spark-runtime.

  1. Configurar Lake Formation para operaciones DML/DDL:
   # IAM Policy para un rol de Glue
   {
     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "lakeformation:GetDataAccess",
           "lakeformation:GrantPermissions",
           "glue:UpdateTable",
           "glue:DeleteTable"
         ],
         "Resource": "arn:aws:glue:us-east-1:123456789012:table/my_database/*"
       }
     ]
   }
   

Qué deberían hacer los administradores y equipos técnicos

1. Evaluar impacto en pipelines existentes

  • Auditar scripts PySpark/Scala:
– Buscar UDFs que usen pickle o reflexión (ej: getattr(obj, "method")).

– Revisar dependencias con pip freeze > requirements.txt y comparar con AWS Glue 5.1 PyPI requirements.

– Ejecutar jobs en modo dry-run con:

    aws glue start-job-run \
      --job-name "mi-pipeline-test" \
      --arguments '{
        "--additional-python-modules": "pyspark==3.5.6,delta-spark==3.3.2",
        "--conf": "spark.sql.iceberg.vectorized-reader.enabled=true"
      }'
    

2. Actualizar permisos en Lake Formation

  • Para equipos que usen Spark SQL:
  -- Otorgar permisos DML/DDL a un rol IAM
  CALL lakeformation.grant_permissions(
    principal => 'arn:aws:iam::123456789012:role/DataEngineerRole',
    permissions => ARRAY['INSERT', 'UPDATE', 'DELETE', 'DESCRIBE'],
    resource_catalog => 'my_catalog'
  );
  
  • Para tablas Hudi/Delta:
  # En un notebook Glue
  from awsglue.context import GlueContext
  glueContext = GlueContext(SparkContext.getOrCreate())

  # Aplicar permisos a nivel de tabla
  glueContext.add_permissions(
      database_name="my_database",
      table_name="hudi_table",
      principal_arn="arn:aws:iam::123456789012:role/DataAnalystRole",
      permissions=["SELECT", "INSERT"]
  )
  

3. Optimizar configuración para Spark 3.5.6

  • Ajustar parámetros para jobs largos:
  # Configuración recomendada para clusters con >64 GB de RAM
  --conf spark.executor.memory=24g
  --conf spark.executor.memoryOverhead=4g
  --conf spark.memory.fraction=0.6
  --conf spark.sql.adaptive.enabled=true
  --conf spark.sql.adaptive.coalescePartitions.enabled=true
  
  • Habilitar vectorized reader para Iceberg:
  spark.conf.set("spark.sql.iceberg.vectorized-reader.enabled", "true")
  

4. Migrar a Iceberg 3.0 de forma incremental

  • Crear vistas materialesizadas para mantener compatibilidad con queries antiguas:
  CREATE VIEW v_orders_legacy AS
  SELECT id, customer_id, order_date, amount
  FROM orders
  WHERE date_format(order_date, 'yyyy-MM') = '2023-12';
  
  • Usar merge-on-read para tablas Hudi:
  df.write \
    .format("hudi") \
    .option("hoodie.table.name", "sales") \
    .option("hoodie.datasource.write.operation", "upsert") \
    .option("hoodie.datasource.write.recordkey.field", "id") \
    .mode("append") \
    .save("s3://my-bucket/data/sales/")
  

5. Validar en GovCloud (US) si es aplicable

  • Configurar KMS con claves propias:
  aws glue create-job \
    --name "job-govcloud" \
    --role "arn:aws:iam::123456789012:role/AWSGlueServiceRole-GovCloud" \
    --command '{
      "Name": "pythonshell",
      "PythonVersion": "3.11",
      "ScriptLocation": "s3://my-bucket/scripts/"
    }' \
    --defaultArguments '{
      "--KMSKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-5678-90ef-ghij-klmnopqrstuv"
    }'
  

Conclusión

AWS Glue 5.1 no es solo una actualización de versiones: introduce cambios disruptivos en formatos abiertos (Iceberg 3.0), controles de seguridad (Lake Formation para DML/DDL) y performance (Spark 3.5.6). La clave está en probar en entornos aislados, auditar UDFs y actualizar permisos antes de migrar pipelines productivos. Para equipos en GovCloud, validar restricciones de KMS es crítico. Si tu pipeline depende de Hudi o Delta Lake, prioriza la migración de metadatos y revisa la documentación de breaking changes en AWS Glue 5.1 release notes.

FIN

Deja una respuesta

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