Utilisation de vues matérialisées avec Amazon EMR - Amazon EMR

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de vues matérialisées avec Amazon EMR

Les versions 7.12.0 et ultérieures d'Amazon EMR prennent en charge la création et la gestion de vues matérialisées Apache Iceberg dans le catalogue de données Glue. AWS Une vue matérialisée est une table gérée qui stocke le résultat précalculé d'une requête SQL au format Apache Iceberg et qui est mise à jour progressivement à mesure que les tables sources sous-jacentes changent. Vous pouvez utiliser des vues matérialisées pour simplifier les pipelines de transformation des données et accélérer les performances des requêtes pour les charges de travail analytiques complexes.

Lorsque vous créez une vue matérialisée à l'aide de Spark sur Amazon EMR, la définition de la vue et les métadonnées sont stockées dans le catalogue de données AWS Glue. Les résultats précalculés sont stockés sous forme de tables Apache Iceberg dans des compartiments Amazon S3 Tables ou dans des compartiments à usage général Amazon S3 au sein de votre compte. AWS Le catalogue de données AWS Glue surveille automatiquement les tables sources et actualise les vues matérialisées à l'aide d'une infrastructure informatique gérée.

Comment fonctionnent les vues matérialisées avec Amazon EMR

Les vues matérialisées s'intègrent à Amazon EMR via le support Iceberg d'Apache Spark. Lorsque vous configurez votre session Spark pour utiliser le catalogue de données AWS Glue, vous pouvez créer des vues matérialisées à l'aide de la syntaxe SQL standard. L'optimiseur Spark peut automatiquement réécrire les requêtes pour utiliser des vues matérialisées lorsqu'elles offrent de meilleures performances, éliminant ainsi le besoin de modifier manuellement le code de l'application.

Le catalogue de données AWS Glue gère tous les aspects opérationnels de la maintenance des vues matérialisées, notamment :

  • Détecter les modifications dans les tables sources à l'aide de la couche de métadonnées d'Apache Iceberg

  • Planification et exécution des opérations d'actualisation à l'aide du calcul géré par Spark

  • Déterminer s'il convient d'effectuer une actualisation complète ou incrémentielle en fonction des modifications apportées aux données

  • Stockage des résultats précalculés au format Apache Iceberg pour un accès multimoteur

Vous pouvez interroger des vues matérialisées depuis Amazon EMR à l'aide des mêmes interfaces SQL Spark que celles que vous utilisez pour les tables classiques. Les données précalculées sont également accessibles depuis d'autres services, notamment Amazon Athena et Amazon Redshift.

Conditions préalables

Pour utiliser des vues matérialisées avec Amazon EMR, vous devez :

  • Un AWS compte

  • Un cluster Amazon EMR exécutant la version 7.12.0 ou ultérieure

  • Tables sources au format Apache Iceberg enregistrées dans le catalogue de données AWS Glue

  • AWS Autorisations de Lake Formation configurées pour les tables sources et les bases de données cibles

  • Un bucket S3 Tables ou un bucket S3 à usage général enregistré auprès de AWS Lake Formation pour le stockage de données de vues matérialisées

Configuration de Spark pour utiliser des vues matérialisées

Pour créer et gérer des vues matérialisées, configurez votre session Spark avec les extensions Iceberg et les paramètres de catalogue requis. La configuration varie selon que vos tables sources et vues matérialisées utilisent des compartiments S3 Tables ou des compartiments S3 à usage général.

Configuration pour les tables S3

Lorsque vous utilisez des compartiments S3 Tables pour des vues matérialisées, configurez des références de catalogue distinctes pour vos tables sources et vos vues matérialisées :

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

Configuration pour les compartiments à usage général S3

Lorsque vous utilisez des buckets S3 à usage général, configurez une référence de catalogue unique :

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

Activation de l'actualisation incrémentielle

Pour activer l'optimisation de l'actualisation incrémentielle, ajoutez les propriétés de configuration suivantes à votre session Spark :

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

Paramètres de configuration

Les paramètres de configuration suivants contrôlent le comportement des vues matérialisées :

  • spark.sql.extensions— Active les extensions de session Iceberg Spark requises pour la prise en charge des vues matérialisées.

  • spark.sql.optimizer.answerQueriesWithMVs.enabled— Permet la réécriture automatique des requêtes pour utiliser des vues matérialisées. Définissez ce paramètre sur true pour activer cette optimisation.

  • spark.sql.optimizer.incrementalMVRefresh.enabled— Permet une optimisation de l'actualisation incrémentielle. Définissez cette valeur sur true pour traiter uniquement les données modifiées lors des opérations d'actualisation.

Création de vues matérialisées

Vous créez des vues matérialisées à l'aide de l'instruction SQL CREATE MATERIALIZED VIEW. La définition de la vue spécifie la logique de transformation sous la forme d'une requête SQL qui fait référence à une ou plusieurs tables sources.

DLLs

Créer une vue

{ 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 } }
Note

Les view_clauses doivent apparaître avant le select_statement.

Création d'une vue matérialisée de base

L'exemple suivant crée une vue matérialisée qui agrège les données de commande par client, utilise des noms de table complets avec une convention de dénomination en trois parties dans la définition de la vue :

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;

Création d'une vue matérialisée avec actualisation automatique

Pour configurer l'actualisation automatique, spécifiez un calendrier d'actualisation lors de la création de la vue en utilisant des noms de table complets avec une convention de dénomination en trois parties dans la définition de la vue :

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;

Création d'une vue matérialisée avec des références croisées à des catalogues

Lorsque vos tables sources se trouvent dans un catalogue différent de celui de votre vue matérialisée, utilisez des noms de table complets avec une convention de dénomination en trois parties à la fois dans le nom de la vue et dans la définition de la vue :

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;

Interrogation de vues matérialisées

Après avoir créé une vue matérialisée, vous pouvez l'interroger comme n'importe quelle autre table à l'aide des instructions SQL SELECT standard :

SELECT * FROM customer_orders;

Réécriture automatique des requêtes

Lorsque la réécriture automatique des requêtes est activée, l'optimiseur Spark analyse vos requêtes et utilise automatiquement des vues matérialisées lorsqu'elles peuvent améliorer les performances. Par exemple, si vous exécutez la requête suivante :

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

L'optimiseur Spark réécrit automatiquement cette requête pour utiliser la vue matérialisée customer_orders au lieu de traiter la table des commandes de base, à condition que la vue matérialisée soit à jour.

Vérification de la réécriture automatique des requêtes

Pour vérifier si une requête utilise la réécriture automatique des requêtes, utilisez la commande EXPLAIN EXTENDED :

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

Dans le plan d'exécution, recherchez le nom de la vue matérialisée dans l' BatchScanopération. Si le plan affiche BatchScan glue_catalog.analytics.customer_orders au lieu de glue_catalog.sales.orders, la requête a été automatiquement réécrite pour BatchScan utiliser la vue matérialisée.

Note

La réécriture automatique des requêtes nécessite du temps pour que le cache de métadonnées Spark soit rempli après la création d'une vue matérialisée. Ce processus se termine généralement dans les 30 secondes.

Actualisation de vues matérialisées

Vous pouvez actualiser les vues matérialisées à l'aide de deux méthodes : actualisation complète ou actualisation incrémentielle. L'actualisation complète recalcule l'intégralité de la vue matérialisée à partir de toutes les données de la table de base, tandis que l'actualisation incrémentielle traite uniquement les données modifiées depuis la dernière actualisation.

Actualisation complète manuelle

Pour actualiser complètement une vue matérialisée, procédez comme suit :

REFRESH MATERIALIZED VIEW customer_orders FULL;

Après avoir exécuté cette commande, interrogez la vue matérialisée pour vérifier les résultats mis à jour :

SELECT * FROM customer_orders;

Actualisation incrémentielle manuelle

Pour effectuer une actualisation incrémentielle, assurez-vous que l'actualisation incrémentielle est activée dans la configuration de votre session Spark, puis exécutez :

REFRESH MATERIALIZED VIEW customer_orders;

Le catalogue de données AWS Glue détermine automatiquement si une actualisation incrémentielle est applicable en fonction de la définition de la vue et de la quantité de données modifiées. Si l'actualisation incrémentielle n'est pas possible, l'opération revient à une actualisation complète.

Vérification de l'exécution de l'actualisation incrémentielle

Pour vérifier que l'actualisation incrémentielle a bien été exécutée, vous pouvez vérifier les propriétés de la lastRefreshType table en exécutant les commandes suivantes :

SHOW TBLPROPERTIES <mvName>("lastRefreshType")

Cela peut également être réalisé en activant la journalisation du débogage en modifiant la configuration de votre journal Spark :

  1. Ouvrez le fichier de configuration Spark log4j :

    sudo vim /usr/lib/spark/conf/log4j2.properties
  2. Ajoutez les configurations d'enregistreur suivantes :

    logger.spark.name = org.apache.spark.sql logger.spark.level = debug logger.inmemcache.name = org.apache.spark.sql.InMemMvMetadataCache logger.inmemcache.level = off
  3. Après avoir exécuté une opération d'actualisation, recherchez le message suivant dans la sortie de Spark :

    DEBUG RefreshMaterializedViewExec: Executed Incremental Refresh

Gestion des vues matérialisées

Amazon EMR fournit des commandes SQL pour gérer le cycle de vie des vues matérialisées.

Décrire une vue matérialisée

Pour afficher les métadonnées relatives à une vue matérialisée, notamment sa définition, son état d'actualisation et l'horodatage de la dernière actualisation :

DESCRIBE EXTENDED customer_orders;

Modification d'une vue matérialisée

Pour modifier le calendrier d'actualisation d'une vue matérialisée existante, procédez comme suit :

ALTER MATERIALIZED VIEW customer_orders ADD SCHEDULE REFRESH EVERY 2 HOURS;

Pour supprimer l'actualisation automatique, procédez comme suit :

ALTER MATERIALIZED VIEW customer_orders DROP SCHEDULE;

Supprimer une vue matérialisée

Pour supprimer une vue matérialisée :

DROP MATERIALIZED VIEW customer_orders;

Cette commande supprime la définition de la vue matérialisée du catalogue de données AWS Glue et supprime les données de la table Iceberg sous-jacente de votre compartiment S3.

Autorisations pour les vues matérialisées

Pour créer et gérer des vues matérialisées, vous devez configurer les autorisations de AWS Lake Formation. Le rôle IAM qui crée la vue matérialisée (le rôle de définition) nécessite des autorisations spécifiques sur les tables sources et les bases de données cibles.

Autorisations requises pour le rôle de définisseur

Le rôle de définition doit disposer des autorisations Lake Formation suivantes :

  • Sur les tables sources : autorisations SELECT ou ALL sans filtres de ligne, de colonne ou de cellule

  • Sur la base de données cible : autorisation CREATE_TABLE

  • Sur le catalogue AWS de données Glue GetTable et les autorisations CreateTable d'API

Lorsque vous créez une vue matérialisée, l'ARN du rôle de définition est stocké dans la définition de la vue. Le catalogue de données AWS Glue assume ce rôle lorsqu'il exécute des opérations d'actualisation automatique. Si le rôle de définition perd l'accès aux tables sources, les opérations d'actualisation échoueront tant que les autorisations ne seront pas restaurées.

Octroi de l'accès aux vues matérialisées

Pour autoriser d'autres utilisateurs à interroger une vue matérialisée, utilisez AWS Lake Formation pour accorder l'autorisation SELECT sur la table des vues matérialisées. Les utilisateurs peuvent interroger la vue matérialisée sans avoir besoin d'accéder directement aux tables sources sous-jacentes.

Pour des informations détaillées sur la configuration des autorisations de Lake Formation, consultez la section Octroi et révocation d'autorisations sur les ressources du catalogue de données dans le guide du développeur de AWS Lake Formation.

Surveillance des opérations de visualisation matérialisée

Le AWS Glue Data Catalog publie des statistiques et des journaux pour les opérations d'actualisation des vues matérialisées sur Amazon CloudWatch. Vous pouvez surveiller l'état, la durée et le volume de données traités par le biais de CloudWatch métriques d'actualisation.

Affichage des métriques d'actualisation

Pour consulter les mesures d'actualisation des vues matérialisées :

  1. Ouvrez la CloudWatch console.

  2. Choisissez Metrics dans le volet de navigation.

  3. Sélectionnez l'espace de noms Glue.

  4. Filtrez les métriques en fonction du nom de la vue matérialisée.

Configuration des alarmes

Pour recevoir des notifications lorsque les opérations d'actualisation échouent ou dépassent la durée prévue, créez des CloudWatch alarmes sur les métriques des vues matérialisées. Vous pouvez également configurer les EventBridge règles Amazon pour déclencher des réponses automatisées afin d'actualiser les événements.

Exemple : flux de travail complet

L'exemple suivant illustre un flux de travail complet pour créer et utiliser une vue matérialisée sur Amazon EMR.

  1. Connectez-vous au nœud principal de votre cluster EMR via SSH.

  2. Créez une table de base avec des exemples de données :

    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. Créez une vue matérialisée :

    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. Interrogez la vue matérialisée :

    SELECT * FROM customer_summary;
  5. Insérez des données supplémentaires dans le tableau de base :

    INSERT INTO orders VALUES (4, 'Jane Smith', 350.00, DATE('2024-01-18')), (5, 'Bob Johnson', 100.25, DATE('2024-01-19'));
  6. Actualisez la vue matérialisée :

    REFRESH MATERIALIZED VIEW customer_summary FULL;
  7. Vérifiez les résultats mis à jour :

    SELECT * FROM customer_summary;

Considérations et restrictions

Tenez compte des points suivants lorsque vous utilisez des vues matérialisées avec Amazon EMR :

  • Les vues matérialisées nécessitent la version 7.12.0 ou ultérieure d'Amazon EMR.

  • Les tables sources doivent être des tables Apache Iceberg enregistrées dans le catalogue de données AWS Glue. Les tables Apache Hive, Apache Hudi et Linux Foundation Delta Lake ne sont pas prises en charge au lancement.

  • Les tables sources doivent résider dans la même AWS région et dans le même AWS compte que la vue matérialisée.

  • Toutes les tables sources doivent être régies par AWS Lake Formation. Les autorisations IAM uniquement et l'accès hybride ne sont pas pris en charge.

  • Les vues matérialisées ne peuvent pas faire référence aux vues AWS Glue Data Catalog, aux vues multidialectes ou à d'autres vues matérialisées en tant que tables sources.

  • Le rôle de définition de vues doit disposer d'un accès complet en lecture (autorisation SELECT ou ALL) sur toutes les tables sources sans appliquer de filtres de ligne, de colonne ou de cellule.

  • Les vues matérialisées sont finalement cohérentes avec les tables sources. Pendant la fenêtre d'actualisation, les requêtes peuvent renvoyer des données périmées. Exécutez une actualisation manuelle pour une cohérence immédiate.

  • L'intervalle d'actualisation automatique minimum est d'une heure.

  • L'actualisation incrémentielle prend en charge un sous-ensemble restreint d'opérations SQL. La définition de la vue doit être un seul bloc SELECT-FROM-WHERE-GROUP BY-HAVING et ne peut pas contenir d'opérations définies, de sous-requêtes, le mot clé DISTINCT dans SELECT ou de fonctions d'agrégation, de fonctions de fenêtre ou de jointures autres que INNER JOIN.

  • L'actualisation incrémentielle ne prend pas en charge les fonctions définies par l'utilisateur ni certaines fonctions intégrées. Seul un sous-ensemble des fonctions intégrées de Spark SQL est pris en charge.

  • La réécriture automatique des requêtes ne prend en compte que les vues matérialisées dont les définitions appartiennent à un sous-ensemble SQL restreint similaire aux restrictions d'actualisation incrémentielle.

  • Les opérations d'actualisation complète remplacent l'intégralité du tableau et rendent les instantanés précédents indisponibles.

  • Les identifiants contenant des caractères spéciaux autres que des caractères alphanumériques et des traits de soulignement ne sont pas pris en charge dans les requêtes CREATE MATERIALIZED VIEW.

  • Les colonnes de vues matérialisées commençant par le préfixe __ivm sont réservées à l'utilisation du système. AWS se réserve le droit de modifier ou de supprimer ces colonnes dans les futures versions.

  • Les clauses SORT BY, LIMIT, OFFSET, CLUSTER BY et ORDER BY ne sont pas prises en charge dans les définitions de vues matérialisées.

  • Les tables sources entre régions et entre comptes ne sont pas prises en charge.

  • Les fonctions non déterministes telles que rand () ou current_timestamp () ne sont pas prises en charge dans les définitions de vues matérialisées.