Utilizzo di viste materializzate con Amazon EMR - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di viste materializzate con Amazon EMR

La versione 7.12.0 e successive di Amazon EMR supporta la creazione e la gestione delle viste materializzate di Apache Iceberg nel Glue Data Catalog. AWS Una vista materializzata è una tabella gestita che memorizza il risultato precalcolato di una query SQL in formato Apache Iceberg e si aggiorna in modo incrementale man mano che le tabelle di origine sottostanti cambiano. È possibile utilizzare le viste materializzate per semplificare le pipeline di trasformazione dei dati e accelerare le prestazioni delle query per carichi di lavoro analitici complessi.

Quando crei una vista materializzata utilizzando Spark su Amazon EMR, la definizione della vista e i metadati vengono archiviati nel Glue Data Catalog. AWS I risultati precalcolati vengono archiviati come tabelle Apache Iceberg in bucket Amazon S3 Tables o bucket Amazon S3 per uso generico all'interno del tuo account. AWS Il AWS Glue Data Catalog monitora automaticamente le tabelle dei sorgenti e aggiorna le viste materializzate utilizzando un'infrastruttura di elaborazione gestita.

Come funzionano le viste materializzate con Amazon EMR

Le viste materializzate si integrano con Amazon EMR tramite il supporto Iceberg di Apache Spark. Quando configuri la sessione Spark per utilizzare il AWS Glue Data Catalog, puoi creare viste materializzate utilizzando la sintassi SQL standard. L'ottimizzatore Spark può riscrivere automaticamente le query per utilizzare le viste materializzate quando offrono prestazioni migliori, eliminando la necessità di modificare manualmente il codice dell'applicazione.

Il AWS Glue Data Catalog gestisce tutti gli aspetti operativi della manutenzione delle viste materializzate, tra cui:

  • Rilevamento delle modifiche nelle tabelle dei sorgenti utilizzando il livello di metadati di Apache Iceberg

  • Pianificazione ed esecuzione di operazioni di aggiornamento utilizzando il calcolo Spark gestito

  • Determinare se eseguire un aggiornamento completo o incrementale in base alle modifiche dei dati

  • Memorizzazione dei risultati precalcolati in formato Apache Iceberg per l'accesso a più motori

Puoi interrogare le viste materializzate da Amazon EMR utilizzando le stesse interfacce SQL Spark utilizzate per le tabelle normali. I dati precalcolati sono accessibili anche da altri servizi, tra cui Amazon Athena e Amazon Redshift.

Prerequisiti

Per utilizzare le viste materializzate con Amazon EMR, hai bisogno di:

  • Un account AWS

  • Un cluster Amazon EMR con la release 7.12.0 o successiva

  • Tabelle di origine in formato Apache Iceberg registrate nel AWS Glue Data Catalog

  • AWS Autorizzazioni Lake Formation configurate per le tabelle di origine e i database di destinazione

  • Un bucket S3 Tables o un bucket S3 per uso generico registrato con AWS Lake Formation per l'archiviazione di dati di viste materializzate

Configurazione di Spark per l'utilizzo di viste materializzate

Per creare e gestire le viste materializzate, configura la sessione Spark con le estensioni Iceberg e le impostazioni del catalogo richieste. La configurazione varia a seconda che le tabelle di origine e le viste materializzate utilizzino i bucket S3 Tables o i bucket S3 per uso generico.

Configurazione per le tabelle S3

Quando utilizzi i bucket S3 Tables per le viste materializzate, configura riferimenti di catalogo separati per le tabelle di origine e le viste materializzate:

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

Configurazione per bucket S3 per uso generico

Quando usi i bucket generici S3, configura un singolo riferimento al catalogo:

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

Abilitazione dell'aggiornamento incrementale

Per abilitare l'ottimizzazione dell'aggiornamento incrementale, aggiungi le seguenti proprietà di configurazione alla tua sessione Spark:

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

Parametri di configurazione

I seguenti parametri di configurazione controllano il comportamento delle viste materializzate:

  • spark.sql.extensions— Abilita le estensioni di sessione Iceberg Spark necessarie per il supporto delle viste materializzate.

  • spark.sql.optimizer.answerQueriesWithMVs.enabled— Consente la riscrittura automatica delle query per utilizzare le viste materializzate. Imposta su true per attivare questa ottimizzazione.

  • spark.sql.optimizer.incrementalMVRefresh.enabled— Abilita l'ottimizzazione dell'aggiornamento incrementale. Impostato su true per elaborare solo i dati modificati durante le operazioni di aggiornamento.

Creazione di viste materializzate

Le viste materializzate vengono create utilizzando l'istruzione SQL CREATE MATERIALIZED VIEW. La definizione della vista specifica la logica di trasformazione come una query SQL che fa riferimento a una o più tabelle di origine.

DLLs

Crea 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

Le view_clauses devono apparire prima di select_statement.

Creazione di una vista materializzata di base

L'esempio seguente crea una vista materializzata che aggrega i dati degli ordini per cliente, utilizza nomi di tabelle completi con una convenzione di denominazione in tre parti nella definizione della 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;

Creazione di una vista materializzata con aggiornamento automatico

Per configurare l'aggiornamento automatico, specificate una pianificazione di aggiornamento durante la creazione della vista utilizzando nomi di tabella completi con una convenzione di denominazione in tre parti nella definizione della 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;

Creazione di una vista materializzata con riferimenti tra cataloghi

Quando le tabelle di origine si trovano in un catalogo diverso rispetto alla vista materializzata, utilizzate nomi di tabella completi con una convenzione di denominazione in tre parti sia nel nome della vista che nella definizione della 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;

Invio di query alle viste materializzate

Dopo aver creato una vista materializzata, puoi interrogarla come qualsiasi altra tabella utilizzando le istruzioni SQL SELECT standard:

SELECT * FROM customer_orders;

Riscrittura automatica delle query

Quando la riscrittura automatica delle query è abilitata, l'ottimizzatore Spark analizza le query e utilizza automaticamente le viste materializzate quando possono migliorare le prestazioni. Ad esempio, se esegui la seguente query:

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

L'ottimizzatore Spark riscrive automaticamente questa query per utilizzare la vista materializzata customer_orders invece di elaborare la tabella degli ordini di base, a condizione che la vista materializzata sia aggiornata.

Verifica della riscrittura automatica delle query

Per verificare se una query utilizza la riscrittura automatica delle query, utilizzate il comando EXPLAIN EXTENDED:

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

Nel piano di esecuzione, cercate il nome della vista materializzata nell' BatchScanoperazione. Se il piano mostra BatchScan glue_catalog.analytics.customer_orders anziché glue_catalog.sales.orders, la query è stata riscritta automaticamente per utilizzare la BatchScan vista materializzata.

Nota

La riscrittura automatica delle query richiede del tempo prima che la cache dei metadati Spark venga compilata dopo la creazione di una vista materializzata. Questo processo viene in genere completato entro 30 secondi.

Aggiornamento delle viste materializzate

È possibile aggiornare le viste materializzate utilizzando due metodi: aggiornamento completo o aggiornamento incrementale. L'aggiornamento completo ricalcola l'intera vista materializzata da tutti i dati della tabella di base, mentre l'aggiornamento incrementale elabora solo i dati che sono stati modificati dall'ultimo aggiornamento.

Aggiornamento manuale completo

Per eseguire un aggiornamento completo di una vista materializzata:

REFRESH MATERIALIZED VIEW customer_orders FULL;

Dopo aver eseguito questo comando, interroga la vista materializzata per verificare i risultati aggiornati:

SELECT * FROM customer_orders;

Aggiornamento incrementale manuale

Per eseguire un aggiornamento incrementale, assicurati che l'aggiornamento incrementale sia abilitato nella configurazione della sessione Spark, quindi esegui:

REFRESH MATERIALIZED VIEW customer_orders;

Il AWS Glue Data Catalog determina automaticamente se l'aggiornamento incrementale è applicabile in base alla definizione della vista e alla quantità di dati modificati. Se l'aggiornamento incrementale non è possibile, l'operazione torna all'aggiornamento completo.

Verifica dell'esecuzione dell'aggiornamento incrementale

Per confermare che l'aggiornamento incrementale sia stato eseguito correttamente, puoi controllare le proprietà della lastRefreshType tabella eseguendo i seguenti comandi:

SHOW TBLPROPERTIES <mvName>("lastRefreshType")

Inoltre, questo può essere ottenuto anche abilitando la registrazione di debug modificando la configurazione del registro Spark:

  1. Apri il file di configurazione di Spark log4j:

    sudo vim /usr/lib/spark/conf/log4j2.properties
  2. Aggiungi le seguenti configurazioni del logger:

    logger.spark.name = org.apache.spark.sql logger.spark.level = debug logger.inmemcache.name = org.apache.spark.sql.InMemMvMetadataCache logger.inmemcache.level = off
  3. Dopo aver eseguito un'operazione di aggiornamento, cerca il seguente messaggio nell'output di Spark:

    DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh

Gestione delle viste materializzate

Amazon EMR fornisce comandi SQL per la gestione del ciclo di vita delle viste materializzate.

Descrivere una vista materializzata

Per visualizzare i metadati relativi a una vista materializzata, tra cui la definizione, lo stato di aggiornamento e il timestamp dell'ultimo aggiornamento:

DESCRIBE EXTENDED customer_orders;

Alterazione di una vista materializzata

Per modificare la pianificazione di aggiornamento di una vista materializzata esistente:

ALTER MATERIALIZED VIEW customer_orders ADD SCHEDULE REFRESH EVERY 2 HOURS;

Per rimuovere l'aggiornamento automatico:

ALTER MATERIALIZED VIEW customer_orders DROP SCHEDULE;

Eliminare una vista materializzata

Per eliminare una vista materializzata:

DROP MATERIALIZED VIEW customer_orders;

Questo comando rimuove la definizione della vista materializzata dal AWS Glue Data Catalog ed elimina i dati della tabella Iceberg sottostante dal bucket S3.

Autorizzazioni per le viste materializzate

Per creare e gestire viste materializzate, devi configurare le autorizzazioni di AWS Lake Formation. Il ruolo IAM che crea la vista materializzata (il ruolo definer) richiede autorizzazioni specifiche sulle tabelle di origine e sui database di destinazione.

Autorizzazioni richieste per il ruolo di definitore

Il ruolo che definisce deve avere i seguenti permessi di Lake Formation:

  • Nelle tabelle di origine: autorizzazioni SELECT o ALL senza filtri di riga, colonna o cella

  • Sul database di destinazione: autorizzazione CREATE_TABLE

  • Sul AWS Glue Data Catalog GetTable e sulle autorizzazioni CreateTable API

Quando si crea una vista materializzata, l'ARN del ruolo definitore viene memorizzato nella definizione della vista. Il AWS Glue Data Catalog assume questo ruolo durante l'esecuzione di operazioni di aggiornamento automatico. Se il ruolo di definitore perde l'accesso alle tabelle di origine, le operazioni di aggiornamento falliranno fino al ripristino delle autorizzazioni.

Concessione dell'accesso alle viste materializzate

Per concedere ad altri utenti l'accesso per interrogare una vista materializzata, usa AWS Lake Formation per concedere l'autorizzazione SELECT sulla tabella delle viste materializzate. Gli utenti possono interrogare la vista materializzata senza richiedere l'accesso diretto alle tabelle di origine sottostanti.

Per informazioni dettagliate sulla configurazione delle autorizzazioni di Lake Formation, consulta Concessione e revoca delle autorizzazioni sulle risorse del Data Catalog nella Lake Formation Developer Guide. AWS

Monitoraggio delle operazioni di visualizzazione materializzata

Il AWS Glue Data Catalog pubblica metriche e log per le operazioni di aggiornamento delle viste materializzate su Amazon. CloudWatch Puoi monitorare lo stato dell'aggiornamento, la durata e il volume di dati elaborati tramite metriche. CloudWatch

Visualizzazione delle metriche di aggiornamento

Per visualizzare le metriche di aggiornamento delle viste materializzate:

  1. Apri la console. CloudWatch

  2. Scegli Metriche dal pannello di navigazione.

  3. Selezionare lo spazio dei nomi Glue.

  4. Filtra le metriche in base al nome della vista materializzata.

Configurazione degli allarmi

Per ricevere notifiche quando le operazioni di aggiornamento falliscono o superano la durata prevista, crea CloudWatch allarmi sulle metriche delle viste materializzate. Puoi anche configurare EventBridge le regole di Amazon per attivare risposte automatiche agli eventi di aggiornamento.

Esempio: flusso di lavoro completo

L'esempio seguente dimostra un flusso di lavoro completo per la creazione e l'utilizzo di una vista materializzata su Amazon EMR.

  1. Connect al nodo primario del cluster EMR tramite SSH.

  2. Crea una tabella di base con dati di esempio:

    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. Crea una vista materializzata:

    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. Interroga la vista materializzata:

    SELECT * FROM customer_summary;
  5. Inserisci dati aggiuntivi nella tabella di base:

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

    REFRESH MATERIALIZED VIEW customer_summary FULL;
  7. Verifica i risultati aggiornati:

    SELECT * FROM customer_summary;

Considerazioni e limitazioni

Considera quanto segue quando utilizzi viste materializzate con Amazon EMR:

  • Le viste materializzate richiedono Amazon EMR versione 7.12.0 o successiva.

  • Le tabelle di origine devono essere tabelle Apache Iceberg registrate nel AWS Glue Data Catalog. Le tabelle Apache Hive, Apache Hudi e Linux Foundation Delta Lake non sono supportate al lancio.

  • Le tabelle di origine devono risiedere nella stessa AWS regione e nello stesso AWS account della vista materializzata.

  • Tutte le tabelle dei sorgenti devono essere governate da AWS Lake Formation. Le autorizzazioni solo IAM e l'accesso ibrido non sono supportati.

  • Le viste materializzate non possono fare riferimento alle viste del AWS Glue Data Catalog, alle viste multidialettali o ad altre viste materializzate come tabelle di origine.

  • Il ruolo View Definer deve disporre dell'accesso completo in lettura (autorizzazione SELECT o ALL) su tutte le tabelle di origine senza applicare filtri di riga, colonna o cella.

  • Le viste materializzate alla fine sono coerenti con le tabelle di origine. Durante la finestra di aggiornamento, le query possono restituire dati non aggiornati. Esegui l'aggiornamento manuale per una coerenza immediata.

  • L'intervallo minimo di aggiornamento automatico è di un'ora.

  • L'aggiornamento incrementale supporta un sottoinsieme limitato di operazioni SQL. La definizione della vista deve essere un singolo blocco SELECT-FROM-WHERE-GROUP BY-HAVING e non può contenere operazioni di set, sottoquery, la parola chiave DISTINCT in SELECT o funzioni aggregate, funzioni di finestra o join diversi da INNER JOIN.

  • L'aggiornamento incrementale non supporta funzioni definite dall'utente o determinate funzioni integrate. È supportato solo un sottoinsieme delle funzioni integrate di Spark SQL.

  • La riscrittura automatica delle query considera solo le viste materializzate le cui definizioni appartengono a un sottoinsieme SQL limitato, simile alle restrizioni di aggiornamento incrementale.

  • Le operazioni di aggiornamento completo sovrascrivono l'intera tabella e rendono non disponibili le istantanee precedenti.

  • Gli identificatori contenenti caratteri speciali diversi dai caratteri alfanumerici e dai caratteri di sottolineatura non sono supportati nelle query CREATE MATERIALIZED VIEW.

  • Le colonne delle viste materializzate che iniziano con il prefisso __ivm sono riservate all'uso del sistema. AWS si riserva il diritto di modificare o rimuovere queste colonne nelle versioni future.

  • Le clausole SORT BY, LIMIT, OFFSET, CLUSTER BY e ORDER BY non sono supportate nelle definizioni delle viste materializzate.

  • Le tabelle di origine tra regioni e tra account non sono supportate.

  • Le funzioni non deterministiche come rand () o current_timestamp () non sono supportate nelle definizioni delle viste materializzate.