Uso de vistas materializadas con Amazon EMR - Amazon EMR

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 vistas materializadas con Amazon EMR

La versión 7.12.0 y posteriores de Amazon EMR admiten la creación y administración de vistas materializadas de Apache Iceberg en el catálogo de datos de Glue. AWS Una vista materializada es una tabla administrada que almacena el resultado precalculado de una consulta SQL en formato Apache Iceberg y se actualiza de forma incremental a medida que cambian las tablas de origen subyacentes. Puede utilizar las vistas materializadas para simplificar la canalización de transformación de datos y acelerar el rendimiento de las consultas para cargas de trabajo analíticas complejas.

Al crear una vista materializada con Spark en Amazon EMR, la definición de la vista y los metadatos se almacenan en el catálogo de datos de AWS Glue. Los resultados precalculados se almacenan como tablas de Apache Iceberg en los buckets de Amazon S3 Tables o en los buckets de uso general de Amazon S3 de su cuenta. AWS El catálogo de datos de AWS Glue supervisa automáticamente las tablas de origen y actualiza las vistas materializadas mediante una infraestructura de procesamiento gestionada.

Cómo funcionan las vistas materializadas con Amazon EMR

Las vistas materializadas se integran con Amazon EMR mediante el soporte Iceberg de Apache Spark. Cuando configuras tu sesión de Spark para usar el catálogo de datos de AWS Glue, puedes crear vistas materializadas con la sintaxis SQL estándar. El optimizador de Spark puede reescribir automáticamente las consultas para utilizar vistas materializadas cuando ofrecen un mejor rendimiento, lo que elimina la necesidad de modificar manualmente el código de la aplicación.

El catálogo de datos de AWS Glue gestiona todos los aspectos operativos del mantenimiento de la vista materializada, incluidos:

  • Detección de cambios en las tablas fuente mediante la capa de metadatos de Apache Iceberg

  • Programación y ejecución de operaciones de actualización mediante cómputo Spark administrado

  • Cómo determinar si realizar una actualización completa o incremental en función de los cambios en los datos

  • Almacenamiento de resultados precalculados en formato Apache Iceberg para el acceso con múltiples motores

Puede consultar vistas materializadas de Amazon EMR mediante las mismas interfaces de Spark SQL que utiliza para las tablas normales. También se puede acceder a los datos precalculados desde otros servicios, como Amazon Athena y Amazon Redshift.

Requisitos previos

Para utilizar vistas materializadas con Amazon EMR, necesita:

  • ¿Una cuenta AWS

  • Un clúster de Amazon EMR que ejecute la versión 7.12.0 o posterior

  • Tablas fuente en formato Apache Iceberg registradas en el catálogo de datos de AWS Glue

  • AWS Permisos de Lake Formation configurados para tablas de origen y bases de datos de destino

  • Una cubeta S3 Tables o una cubeta S3 de uso general registrada en AWS Lake Formation para almacenar datos de vistas materializadas

Configuración de Spark para usar vistas materializadas

Para crear y gestionar vistas materializadas, configura tu sesión de Spark con las extensiones de Iceberg y los ajustes del catálogo necesarios. La configuración varía en función de si las tablas fuente y las vistas materializadas utilizan cubos de S3 Tables o grupos de uso general de S3.

Configuración para tablas de S3

Cuando utilice cubos de S3 Tables para las vistas materializadas, configure referencias de catálogo independientes para las tablas de origen y las vistas materializadas:

spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.glue_catalog.type=glue \ --conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse \ --conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 \ --conf spark.sql.catalog.glue_catalog.glue.id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.catalog.s3t_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.s3t_catalog.type=glue \ --conf spark.sql.catalog.s3t_catalog.glue.id=111122223333:s3tablescatalog/my-table-bucket \ --conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.catalog.s3t_catalog.warehouse=s3://amzn-s3-demo-bucket/mv-warehouse \ --conf spark.sql.catalog.s3t_catalog.glue.region=us-east-1 \ --conf spark.sql.defaultCatalog=s3t_catalog \ // turn on automatic query rewrite (optional) --conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true

Configuración para depósitos de uso general de S3

Cuando utilice depósitos de uso general de S3, configure una referencia de catálogo única:

spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.glue_catalog.type=glue \ --conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse \ --conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 \ --conf spark.sql.catalog.glue_catalog.glue.id=111122223333 \ --conf spark.sql.catalog.s3t_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.s3t_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.defaultCatalog=glue_catalog \ // turn on automatic query rewrite (optional) --conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true

Habilitación de la actualización incremental

Para habilitar la optimización de las actualizaciones incrementales, añade las siguientes propiedades de configuración a tu sesión de Spark:

spark-sql \ --conf spark.sql.optimizer.incrementalMVRefresh.enabled=true \

Parámetros de configuración

Los siguientes parámetros de configuración controlan el comportamiento de la vista materializada:

  • spark.sql.extensions: habilita las extensiones de sesión de Iceberg Spark necesarias para la compatibilidad con la vista materializada.

  • spark.sql.optimizer.answerQueriesWithMVs.enabled: habilita la reescritura automática de consultas para usar vistas materializadas. Establézcalo en «true» para activar esta optimización.

  • spark.sql.optimizer.incrementalMVRefresh.enabled: permite la optimización de la actualización incremental. Establézcalo en «true» para procesar solo los datos modificados durante las operaciones de actualización.

Creación de vistas materializadas

Las vistas materializadas se crean mediante la sentencia SQL CREATE MATERIALIZED VIEW. La definición de vista especifica la lógica de transformación como una consulta SQL que hace referencia a una o más tablas de origen.

DLLs

Crear vista

{ CREATE OR REPLACE MATERIALIZED VIEW | CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] } view_identifier [ view_clauses ] [ schedule_clauses ] AS [ select_statement ] view_clauses = { [ LOCATION location ] | [ PARTITIONED BY (col [, ...]) ] | [ COMMENT view_comment ] | [ SCHEDULE [ REFRESH ] schedule_clause ] } schedule_clause = { EVERY number { HOUR | HOURS | DAY | DAYS | WEEK | WEEKS } }
nota

Las view_clauses deben aparecer antes de la select_statement.

Crear una vista materializada básica

En el siguiente ejemplo, se crea una vista materializada que agrega los datos de los pedidos por cliente. En la definición de la vista, se utilizan nombres de tabla completos con una convención de nomenclatura de tres partes:

CREATE MATERIALIZED VIEW customer_orders AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;

Creación de una vista materializada con actualización automática

Para configurar la actualización automática, especifique un programa de actualización al crear la vista utilizando nombres de tabla completos con una convención de nomenclatura de tres partes en la definición de la vista:

CREATE MATERIALIZED VIEW customer_orders SCHEDULE REFRESH EVERY 1 HOUR AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;

Creación de una vista materializada con referencias entre catálogos

Cuando las tablas de origen se encuentran en un catálogo distinto del de la vista materializada, utilice nombres de tabla totalmente calificados con la convención de nomenclatura de tres partes tanto en el nombre de la vista como en la definición de la vista:

CREATE MATERIALIZED VIEW s3t_catalog.analytics.customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;

Consulta de vistas materializadas

Tras crear una vista materializada, puede consultarla como cualquier otra tabla mediante las instrucciones SQL SELECT estándar:

SELECT * FROM customer_orders;

Reescritura automática de consultas

Cuando la reescritura automática de consultas está habilitada, el optimizador de Spark analiza las consultas y utiliza automáticamente las vistas materializadas para mejorar el rendimiento. Por ejemplo, la siguiente consulta no se ejecuta:

SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM orders GROUP BY customer_name;

El optimizador de Spark reescribe automáticamente esta consulta para utilizar la vista materializada «customer_orders» en lugar de procesar la tabla base de pedidos, siempre que la vista materializada esté actualizada.

Verificación de la reescritura automática de consultas

Para verificar si una consulta utiliza la reescritura automática de consultas, use el comando EXPLAIN EXTENDED:

EXPLAIN EXTENDED SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM orders GROUP BY customer_name;

En el plan de ejecución, busque el nombre de la vista materializada en la BatchScan operación. Si el plan muestra BatchScan glue_catalog.analytics.customer_orders en lugar de glue_catalog.sales.orders, la consulta se ha reescrito automáticamente para BatchScan utilizar la vista materializada.

nota

La reescritura automática de consultas requiere tiempo para que la caché de metadatos de Spark se llene después de crear una vista materializada. Este proceso suele completarse en un plazo de 30 segundos.

Actualización de vistas materializadas

Puede actualizar las vistas materializadas mediante dos métodos: actualización completa o actualización incremental. La actualización completa vuelve a calcular toda la vista materializada a partir de todos los datos de las tablas base, mientras que la actualización incremental procesa únicamente los datos que han cambiado desde la última actualización.

Actualización completa manual

Para realizar una actualización completa de una vista materializada:

REFRESH MATERIALIZED VIEW customer_orders FULL;

Tras ejecutar este comando, consulte la vista materializada para comprobar los resultados actualizados:

SELECT * FROM customer_orders;

Actualización incremental manual

Para realizar una actualización incremental, asegúrese de que la actualización incremental esté habilitada en la configuración de su sesión de Spark y, a continuación, ejecute:

REFRESH MATERIALIZED VIEW customer_orders;

El catálogo de datos de AWS Glue determina automáticamente si la actualización incremental es aplicable en función de la definición de la vista y de la cantidad de datos modificados. Si la actualización incremental no es posible, la operación recurre a una actualización completa.

Verificación de la ejecución de la actualización incremental

Para confirmar que la actualización incremental se ha ejecutado correctamente, puede comprobar las propiedades de la lastRefreshType tabla ejecutando los siguientes comandos:

SHOW TBLPROPERTIES <mvName>("lastRefreshType")

Además, esto también se puede lograr habilitando el registro de depuración modificando la configuración del registro de Spark:

  1. Abre el archivo de configuración log4j de Spark:

    sudo vim /usr/lib/spark/conf/log4j2.properties
  2. Añade las siguientes configuraciones de registro:

    logger.spark.name = org.apache.spark.sql logger.spark.level = debug logger.inmemcache.name = org.apache.spark.sql.InMemMvMetadataCache logger.inmemcache.level = off
  3. Tras ejecutar una operación de actualización, busca el siguiente mensaje en la salida de Spark:

    DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh

Administración de vistas materializadas

Amazon EMR proporciona comandos SQL para gestionar el ciclo de vida de las vistas materializadas.

Descripción de una vista materializada

Para ver los metadatos de una vista materializada, incluida su definición, el estado de actualización y la marca de tiempo de la última actualización:

DESCRIBE EXTENDED customer_orders;

Modificación de una vista materializada

Para modificar el calendario de actualización de una vista materializada existente:

ALTER MATERIALIZED VIEW customer_orders ADD SCHEDULE REFRESH EVERY 2 HOURS;

Para eliminar la actualización automática:

ALTER MATERIALIZED VIEW customer_orders DROP SCHEDULE;

Eliminación de una vista materializada

Para eliminar una vista materializada:

DROP MATERIALIZED VIEW customer_orders;

Este comando elimina la definición de vista materializada del catálogo de datos de AWS Glue y elimina los datos de la tabla Iceberg subyacente del bucket de S3.

Permisos para vistas materializadas

Para crear y administrar vistas materializadas, debe configurar los permisos de AWS Lake Formation. El rol de IAM que crea la vista materializada (la función de definición) requiere permisos específicos en las tablas de origen y las bases de datos de destino.

Permisos requeridos para el rol definidor

El rol definidor debe contar con los siguientes permisos de Lake Formation:

  • En las tablas de origen: permisos SELECT o ALL, sin filtros de filas, columnas ni celdas.

  • En la base de datos de destino: permiso CREATE_TABLE

  • En el catálogo de datos de AWS Glue GetTable y en los permisos CreateTable de la API

Cuando crea una vista materializada, el ARN del rol definidor se almacena en la definición de la vista. El catálogo de datos de AWS Glue asume esta función al ejecutar operaciones de actualización automática. Si el rol definidor pierde el acceso a las tablas de origen, las operaciones de actualización fallarán hasta que se restablezcan los permisos.

Concesión de acceso a vistas materializadas

Para conceder a otros usuarios acceso para consultar una vista materializada, utilice AWS Lake Formation para conceder el permiso SELECT en la tabla de vistas materializadas. Los usuarios pueden consultar la vista materializada sin necesidad de tener acceso directo a las tablas de origen subyacentes.

Para obtener información detallada sobre la configuración de los permisos de Lake Formation, consulte Concesión y revocación de permisos en los recursos del catálogo de datos en la Guía para desarrolladores de AWS Lake Formation.

Supervisión de las operaciones de vistas materializadas

El catálogo de datos de AWS Glue publica métricas y registros para las operaciones de actualización de vistas materializadas en Amazon CloudWatch. Puede supervisar el estado de la actualización, la duración y el volumen de datos procesados mediante CloudWatch métricas.

Visualización de las métricas de actualización

Para ver las métricas de actualización de vistas materializadas:

  1. Abra la CloudWatch consola.

  2. Seleccione Métricas en el panel de navegación.

  3. Seleccione el espacio de nombres Glue (Adherencia).

  4. Filtre las métricas por el nombre de la vista materializada.

Configuración de alarmas

Para recibir notificaciones cuando las operaciones de actualización fallen o superen la duración prevista, cree CloudWatch alarmas en las métricas de visualización materializada. También puedes configurar EventBridge las reglas de Amazon para activar respuestas automatizadas para actualizar los eventos.

Ejemplo: flujo de trabajo completo

El siguiente ejemplo muestra un flujo de trabajo completo para crear y utilizar una vista materializada en Amazon EMR.

  1. Conéctese al nodo principal del clúster de EMR mediante SSH.

  2. Cree una tabla base con datos de ejemplo:

    spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.glue_catalog.type=glue \ --conf spark.sql.catalog.glue_catalog.warehouse=s3://amzn-s3-demo-bucket/warehouse \ --conf spark.sql.catalog.glue_catalog.glue.region=us-east-1 \ --conf spark.sql.catalog.glue_catalog.glue.id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.account-id=111122223333 \ --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true \ --conf spark.sql.defaultCatalog=glue_catalog \ --conf spark.sql.optimizer.answerQueriesWithMVs.enabled=true CREATE DATABASE IF NOT EXISTS sales; USE sales; CREATE TABLE orders ( id INT, customer_name STRING, amount DECIMAL(10,2), order_date DATE ); INSERT INTO orders VALUES (1, 'John Doe', 150.00, DATE('2024-01-15')), (2, 'Jane Smith', 200.50, DATE('2024-01-16')), (3, 'Bob Johnson', 75.25, DATE('2024-01-17'));
  3. Cree una vista materializada:

    CREATE MATERIALIZED VIEW customer_summary AS SELECT customer_name, COUNT(*) as order_count, SUM(amount) as total_amount FROM glue_catalog.sales.orders GROUP BY customer_name;
  4. Consulte la vista materializada:

    SELECT * FROM customer_summary;
  5. Inserte datos adicionales en la tabla base:

    INSERT INTO orders VALUES (4, 'Jane Smith', 350.00, DATE('2024-01-18')), (5, 'Bob Johnson', 100.25, DATE('2024-01-19'));
  6. Actualice la vista materializada:

    REFRESH MATERIALIZED VIEW customer_summary FULL;
  7. Compruebe los resultados actualizados:

    SELECT * FROM customer_summary;

Consideraciones y limitaciones

Tenga en cuenta lo siguiente cuando utilice vistas materializadas con Amazon EMR:

  • Las vistas materializadas requieren Amazon EMR versión 7.12.0 o posterior.

  • Las tablas de origen deben ser tablas de Apache Iceberg registradas en el catálogo de datos de AWS Glue. Las tablas de Apache Hive, Apache Hudi y Delta Lake de Linux Foundation no son compatibles en el lanzamiento.

  • Las tablas de origen deben residir en la misma AWS región y AWS tener en cuenta la vista materializada.

  • Todas las tablas de fuentes deben regirse por AWS Lake Formation. No se admiten los permisos exclusivos de IAM ni el acceso híbrido.

  • Las vistas materializadas no pueden hacer referencia a las vistas del catálogo de datos de AWS Glue, a las vistas multidialectales ni a otras vistas materializadas como tablas de origen.

  • El rol definidor de la vista debe contar con acceso de lectura completo (permisos SELECT o ALL) en todas las tablas de origen, sin aplicar filtros de filas, columnas ni celdas.

  • Las vistas materializadas son eventualmente coherentes con las tablas de origen. Durante la ventana de actualización, las consultas pueden devolver datos obsoletos. Ejecute una actualización manual para obtener consistencia inmediata.

  • El intervalo mínimo de actualización automática es de una hora.

  • La actualización incremental admite un conjunto limitado de operaciones SQL. La definición de la vista debe ser un único bloque SELECT-FROM-WHERE-GROUP BY-HAVING y no puede contener operaciones de conjunto, subconsultas, la palabra clave DISTINCT en las funciones SELECT o agregadas, funciones de ventana o uniones que no sean INNER JOIN.

  • La actualización incremental no admite funciones definidas por el usuario ni determinadas funciones integradas. Solo se admite un subconjunto de las funciones integradas de Spark SQL.

  • La reescritura automática de consultas solo tiene en cuenta vistas materializadas cuyas definiciones pertenecen a un subconjunto restringido de SQL, similar a las restricciones de la actualización incremental.

  • Las operaciones de actualización completa sobrescriben la tabla en su totalidad y hacen que las instantáneas anteriores dejen de estar disponibles.

  • Los identificadores que contienen caracteres especiales distintos de caracteres alfanuméricos y guiones bajos no son compatibles en las consultas CREAR VISTA MATERIALIZADA.

  • Las columnas de vistas materializadas que comienzan con el prefijo __ivm están reservadas para el uso del sistema. AWS se reserva el derecho de modificar o eliminar estas columnas en futuras versiones.

  • Las cláusulas SORT BY, LIMIT, OFFSET, CLUSTER BY y ORDER BY no son compatibles en las definiciones de vistas materializadas.

  • No se admiten tablas de origen entre regiones ni entre cuentas.

  • Las funciones no deterministas, como rand() o current_timestamp(), no son compatibles en las definiciones de vistas materializadas.