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 AWS catálogo de datos de Glue. 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 Glue. AWS Los resultados precalculados se almacenan como tablas de Apache Iceberg en los cubos de Amazon S3 Tables o en los cubos de uso general de Amazon S3 dentro de su cuenta. AWS El catálogo de datos de AWS Glue monitoriza automáticamente las tablas de origen y actualiza las vistas materializadas mediante una infraestructura informática gestionada.
Temas
Cómo funcionan las vistas materializadas con Amazon EMR
Las vistas materializadas se integran con Amazon EMR gracias al soporte para 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 las vistas materializadas, incluidos los siguientes:
-
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 las vistas materializadas de Amazon EMR mediante las mismas interfaces SQL de Spark 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 usar 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 de origen en formato Apache Iceberg registradas en el AWS catálogo de datos de Glue
-
AWS Permisos de Lake Formation configurados para las tablas de origen y las bases de datos de destino
-
Un bucket de S3 Tables o un bucket de uso general de S3 registrado 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 de origen y las vistas materializadas utilizan cubos de S3 Tables o cubos de uso general de S3.
Configuración para tablas S3
Cuando utilice los 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 cubos de uso general de S3
Cuando utilice los cubos de uso general de S3, configure una única referencia de catálogo:
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, agrega 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.
DLL
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.
Creación de una vista materializada básica
El siguiente ejemplo crea una vista materializada que agrega los datos de los pedidos por cliente. Usa nombres de tablas completos con una convención de nomenclatura en tres partes en la definición de la vista:
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 utilizando sentencias 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 usar 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 es aplicable la actualización incremental 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 de tu registro de Spark:
-
Abre el archivo de configuración log4j de Spark:
sudo vim /usr/lib/spark/conf/log4j2.properties -
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 -
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 administrar 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 la vista materializada del catálogo de datos de AWS Glue y elimina los datos de la tabla Iceberg subyacentes de su bucket de S3.
Permisos para vistas materializadas
Para crear y administrar vistas materializadas, debe configurar los permisos para la función de IAM que crea la vista (la función de definidor). Amazon EMR admite dos modelos de permisos:
-
Solo políticas de IAM: si administra su lago de datos con políticas de IAM, no es necesario configurar AWS Lake Formation.
-
AWS Lake Formation: si ya utiliza AWS Lake Formation para administrar su lago de datos, puede configurar los permisos de AWS Lake Formation para obtener vistas materializadas.
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 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 sobre 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 procesado mediante CloudWatch métricas.
Visualización de las métricas de actualización
Para ver las métricas de actualización de la vista materializada:
-
Abre la CloudWatch consola.
-
Seleccione Métricas en el panel de navegación.
-
Seleccione el espacio de nombres Glue (Adherencia).
-
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 esperada, cree CloudWatch alarmas en las métricas de la vista materializada. También puedes configurar EventBridge las reglas de Amazon para activar respuestas automáticas 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.
-
Conéctese al nodo principal de su clúster de EMR mediante SSH.
-
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')); -
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; -
Consulte la vista materializada:
SELECT * FROM customer_summary; -
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')); -
Actualice la vista materializada:
REFRESH MATERIALIZED VIEW customer_summary FULL; -
Verifique los resultados actualizados:
SELECT * FROM customer_summary;
Consideraciones y limitaciones
Tenga en cuenta lo siguiente al utilizar vistas materializadas con Amazon EMR:
-
Las vistas materializadas requieren la versión 7.12.0 o posterior de Amazon EMR.
-
Las tablas fuente deben ser tablas de Apache Iceberg registradas en el AWS catálogo de datos de Glue. Las tablas de Apache Hive, Apache Hudi y Delta Lake de Linux Foundation no son compatibles en el lanzamiento.
-
Las tablas fuente deben residir en la misma AWS región y AWS tener en cuenta la vista materializada.
-
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 SELECT-FROM-WHERE-GROUP BY-HAVING bloque único y no puede contener operaciones de conjunto, subconsultas, la palabra clave DISTINCT en SELECT o funciones agregadas, funciones de ventana o combinaciones distintas de 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 la vista materializada que comienzan con el prefijo __ivm están reservadas para su uso en el sistema. AWS se reserva el derecho de modificar o eliminar estas columnas en versiones futuras.
-
Las cláusulas SORT BY, LIMIT, OFFSET, CLUSTER BY y ORDER BY no son compatibles en las definiciones de vistas materializadas.
-
Cross-Region y no se admiten las tablas de origen multicuenta.
-
Non-deterministic las definiciones de vistas materializadas no admiten funciones como rand () o current_timestamp ().