Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Uso de Apache Iceberg en Amazon EMR
Amazon EMR proporciona procesamiento de datos a escala de petabytes, análisis interactivos y aprendizaje automático en la nube mediante marcos de código abierto como Apache Spark, Apache Hive, Flink y Trino.
nota
Esta guía utiliza Apache Spark como ejemplos.
Amazon EMR admite varias opciones de implementación: Amazon EMR en Amazon EC2, Amazon EMR en Amazon EKS, Amazon EMR Serverless y Amazon EMR activado. AWS Outposts Para elegir una opción de despliegue para su carga de trabajo, consulte las preguntas frecuentes de Amazon EMR.
Compatibilidad de versiones y funciones
La versión 6.5.0 de Amazon EMR y las versiones posteriores admiten Apache Iceberg de forma nativa. Para obtener una lista de las versiones de Iceberg compatibles con cada versión de Amazon EMR, consulte el historial de versiones de Iceberg en la documentación de Amazon EMR. Consulte también las consideraciones y limitaciones del uso de Iceberg en Amazon EMR para ver qué funciones de Iceberg son compatibles con Amazon EMR en diferentes marcos.
Le recomendamos que utilice la última versión de Amazon EMR para beneficiarse de la última versión compatible de Iceberg. En los ejemplos de código y las configuraciones de esta sección se supone que está utilizando la versión emr-6.9.0 de Amazon EMR.
Creación de un clúster de Amazon EMR con Iceberg
En concreto, el clúster debe configurarse con la siguiente clasificación:
[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]
También puede optar por utilizar Amazon EMR Serverless o Amazon EMR en Amazon EKS como opciones de implementación para sus cargas de trabajo de Iceberg, a partir de Amazon EMR 6.6.0.
Desarrollo de aplicaciones Iceberg en Amazon EMR
Para desarrollar el código Spark para sus aplicaciones Iceberg, puede utilizar Amazon EMR Studio, que es un entorno de desarrollo integrado (IDE) basado en la web para cuadernos Jupyter totalmente gestionados que se ejecutan en clústeres de Amazon EMR.
Uso de las libretas Amazon EMR Studio
Puede desarrollar aplicaciones Spark de forma interactiva en las libretas de Amazon EMR Studio Workspace y conectar esas libretas a sus clústeres de Amazon EMR en Amazon EC2 o a Amazon EMR en puntos de enlace gestionados por Amazon EKS. Consulte Servicio de AWS la documentación para obtener instrucciones sobre cómo configurar un EMR Studio para Amazon EMR en Amazon EC2 y Amazon EMR en Amazon EKS.
Para usar Iceberg en EMR Studio, siga estos pasos:
-
Lance un clúster de Amazon EMR con Iceberg activado, tal y como se indica en Uso de un clúster con Iceberg instalado.
-
Configure un estudio de EMR. Para obtener instrucciones, consulte Configurar un Amazon EMR Studio.
-
Abre un cuaderno EMR Studio Workspace y ejecuta el siguiente código como primera celda del cuaderno para configurar tu sesión de Spark para usar Iceberg:
%%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }
donde:
-
<catalog_name>
es el nombre del catálogo de sesiones de Iceberg Spark. Sustitúyalo por el nombre de su catálogo y recuerde cambiar las referencias en todas las configuraciones asociadas a este catálogo. A continuación, en el código, debes hacer referencia a las tablas de Iceberg con el nombre completo de la tabla, incluido el nombre del catálogo de sesiones de Spark, de la siguiente manera:<catalog_name>.<database_name>.<table_name>
-
<catalog_name>.warehouse
apunta a la ruta de Amazon S3 en la que desea almacenar sus datos y metadatos. -
Para convertir el catálogo en un AWS Glue Data Catalog,
<catalog_name>.catalog-impl
configúrelo enorg.apache.iceberg.aws.glue.GlueCatalog
. Esta clave es necesaria para apuntar a una clase de implementación para cualquier implementación de catálogo personalizada. La sección de mejores prácticas generales que aparece más adelante en esta guía describe los diferentes catálogos compatibles con Iceberg. -
Úselo
org.apache.iceberg.aws.s3.S3FileIO
como para aprovechar la<catalog_name>.io-impl
carga multiparte de Amazon S3 para lograr un alto paralelismo.
-
-
Ahora puedes empezar a desarrollar de forma interactiva tu aplicación Spark para Iceberg en el portátil, como lo harías con cualquier otra aplicación de Spark.
Para obtener más información sobre cómo configurar Spark para Apache Iceberg mediante Amazon EMR Studio, consulte la entrada del blog Cree un lago de datos evolutivo, compatible con ACID y de alto rendimiento con Apache Iceberg en Amazon
Ejecutando trabajos de Iceberg en Amazon EMR
Tras desarrollar el código de aplicación de Spark para la carga de trabajo de Iceberg, puede ejecutarlo en cualquier opción de despliegue de Amazon EMR compatible con Iceberg (consulte las preguntas frecuentes sobre Amazon EMR
Al igual que con otros trabajos de Spark, puede enviar trabajos a un clúster de Amazon EMR en Amazon EC2 añadiendo pasos o enviando los trabajos de Spark de forma interactiva al nodo principal. Para ejecutar un trabajo de Spark, consulta las siguientes páginas de documentación de Amazon EMR:
-
Para obtener una descripción general de las diferentes opciones para enviar trabajos a un clúster de Amazon EMR en Amazon EC2 e instrucciones detalladas para cada opción, consulte Enviar trabajo a un clúster.
-
Para Amazon EMR en Amazon EKS, consulte Ejecutar trabajos de Spark con. StartJobRun
En las siguientes secciones se proporciona un ejemplo de cada opción de implementación de Amazon EMR.
Amazon EMR en Amazon EC2
Puede seguir estos pasos para enviar el trabajo de Iceberg Spark:
-
Cree el archivo
emr_step_iceberg.json
con el siguiente contenido en su estación de trabajo:[{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--conf", "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "--conf", "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog", "--conf", "spark.sql.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "--conf", "spark.sql.catalog.<catalog_name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
-
Modifica el archivo de configuración para tu trabajo específico de Spark personalizando las opciones de configuración de Iceberg que aparecen resaltadas en negrita.
-
Envía el paso mediante AWS Command Line Interface ()AWS CLI. Ejecute el comando en el directorio donde se encuentra el
emr_step_iceberg.json
archivo.aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json
Amazon EMR sin servidor
Para enviar un trabajo de Iceberg Spark a Amazon EMR Serverless mediante: AWS CLI
-
Cree el archivo
emr_serverless_iceberg.json
con el siguiente contenido en su estación de trabajo:{ "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars /usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
-
Modifica el archivo de configuración para tu trabajo específico de Spark personalizando las opciones de configuración de Iceberg que aparecen resaltadas en negrita.
-
Envía el trabajo mediante. AWS CLI Ejecute el comando en el directorio donde se encuentra el
emr_serverless_iceberg.json
archivo:aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json
Para enviar un trabajo de Iceberg Spark a Amazon EMR Serverless mediante la consola EMR Studio:
Siga las instrucciones de la documentación de Amazon EMR Serverless.
Para la configuración de Job, utilice la configuración de Iceberg para Spark proporcionada para Iceberg AWS CLI y personalice los campos resaltados para Iceberg. Para obtener instrucciones detalladas, consulte Uso de Apache Iceberg con EMR Serverless en la documentación de Amazon EMR.
Amazon EMR en Amazon EKS
Para enviar un trabajo de Iceberg Spark a Amazon EMR en Amazon EKS mediante: AWS CLI
-
Cree el archivo
emr_eks_iceberg.json
con el siguiente contenido en su estación de trabajo:{ "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
-
Modifica el archivo de configuración de tu trabajo de Spark personalizando las opciones de configuración de Iceberg que aparecen resaltadas en negrita.
-
Envía el trabajo mediante. AWS CLI Ejecute el siguiente comando en el directorio donde se encuentra el
emr_eks_iceberg.json
archivo:aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json
Para obtener instrucciones detalladas, consulte Uso de Apache Iceberg con Amazon EMR en EKS en la documentación de Amazon EMR en EKS.
Prácticas recomendadas para Amazon EMR
En esta sección se proporcionan pautas generales para ajustar los trabajos de Spark en Amazon EMR a fin de optimizar la lectura y la escritura de datos en las tablas de Iceberg. Para conocer las mejores prácticas específicas de Iceberg, consulte la sección de mejores prácticas más adelante en esta guía.
-
Utilice la última versión de Amazon EMR: Amazon EMR proporciona optimizaciones de Spark listas para usar con el tiempo de ejecución de Amazon EMR Spark. AWS mejora el rendimiento del motor de ejecución de Spark con cada nueva versión.
-
Determina la infraestructura óptima para tus cargas de trabajo de Spark: las cargas de trabajo de Spark pueden requerir diferentes tipos de hardware para diferentes características de trabajo a fin de garantizar un rendimiento óptimo. Amazon EMR admite varios tipos de instancias (como optimizadas para cómputo, optimizadas para memoria, de uso general y optimizadas para almacenamiento) para cubrir todos los tipos de requisitos de procesamiento. Cuando incorpore nuevas cargas de trabajo, le recomendamos que utilice tipos de instancias generales como M5 o M6g. Supervise el sistema operativo (SO) y las métricas de YARN de Ganglia y Amazon CloudWatch para determinar los cuellos de botella del sistema (CPU, memoria, almacenamiento y E/S) en momentos de máxima carga y elija el hardware adecuado.
-
spark.sql.shuffle.partitions
Ajustar: establezca laspark.sql.shuffle.partitions
propiedad en el número total de núcleos virtuales (núcleos virtuales) del clúster o en un múltiplo de ese valor (normalmente, de 1 a 2 veces el número total de núcleos virtuales). Esta configuración afecta al paralelismo de Spark cuando se utilizan particiones por hash y rango como modo de distribución de escritura. Solicita una reproducción aleatoria antes de escribir para organizar los datos, lo que garantiza la alineación de las particiones. -
Habilite el escalado administrado: para casi todos los casos de uso, le recomendamos que habilite el escalado administrado y la asignación dinámica. Sin embargo, si tiene una carga de trabajo que sigue un patrón predecible, le sugerimos que desactive el escalado automático y la asignación dinámica. Cuando el escalado gestionado esté activado, le recomendamos que utilice instancias puntuales para reducir los costes. Utilice instancias puntuales para los nodos de tareas en lugar de los nodos principales o maestros. Cuando utilice instancias puntuales, utilice flotas de instancias con varios tipos de instancias por flota para garantizar la disponibilidad puntual.
-
Utilice la unión por transmisión siempre que sea posible: la unión por transmisión (en el lado del mapa) es la combinación más óptima, siempre que una de sus tablas sea lo suficientemente pequeña como para caber en la memoria del nodo más pequeño (del orden de MB) y esté realizando una unión equi (=). Se admiten todos los tipos de uniones, excepto las uniones externas completas. Una unión de difusión difunde la tabla más pequeña como una tabla hash en todos los nodos de trabajo de la memoria. Una vez difundida la tabla pequeña, no podrá realizar cambios en ella. Como la tabla hash se encuentra localmente en la máquina virtual Java (JVM), se puede combinar fácilmente con la tabla grande en función de la condición de unión mediante una combinación hash. Las uniones por transmisión ofrecen un alto rendimiento debido a una sobrecarga mínima de reproducción aleatoria.
-
Ajuste el recolector de basura: si los ciclos de recolección de basura (GC) son lentos, considere cambiar del recolector de basura paralelo predeterminado al G1GC para obtener un mejor rendimiento. Para optimizar el rendimiento del GC, puede ajustar los parámetros del GC. Para hacer un seguimiento del rendimiento del GC, puedes monitorizarlo mediante la interfaz de usuario de Spark. Lo ideal es que el tiempo de GC sea inferior o igual al 1 por ciento del tiempo total de ejecución de la tarea.