View a markdown version of this page

Accès complet à la table Lake Formation pour Amazon EMR sur EC2 - 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.

Accès complet à la table Lake Formation pour Amazon EMR sur EC2

Avec les versions 7.8.0 et supérieures d'Amazon EMR, vous pouvez tirer parti de AWS Lake Formation avec Glue Data Catalog, où le rôle d'exécution des tâches dispose d'autorisations complètes sur les tables sans les limites d'un contrôle d'accès précis. Cette fonctionnalité vous permet de lire et d'écrire dans des tables protégées par Lake Formation depuis votre Amazon EMR sur EC2 Spark batch et des jobs interactifs. Consultez les sections suivantes pour en savoir plus sur Lake Formation et comment l'utiliser avec Amazon EMR sur EC2.

Utiliser Lake Formation avec un accès complet à la table

Vous pouvez accéder aux tableaux du catalogue Glue Data protégés par AWS Lake Formation depuis Amazon EMR sur les jobs EC2 Spark ou les sessions interactives dans lesquelles le rôle d'exécution de la tâche dispose d'un accès complet aux tables. Il n'est pas nécessaire d'activer AWS Lake Formation sur l'application Amazon EMR on EC2. Lorsqu'une tâche Spark est configurée pour un accès complet aux tables (FTA), les informations d'identification AWS Lake Formation sont utilisées pour les données read/write S3 des tables enregistrées par AWS Lake Formation, tandis que les informations d'identification du rôle d'exécution de la tâche seront utilisées pour read/write les tables non enregistrées auprès de AWS Lake Formation.

Important

N'activez pas AWS Lake Formation pour un contrôle d'accès précis. Une tâche ne peut pas exécuter simultanément l'accès complet aux tables (FTA) et le contrôle Fine-Grained d'accès (FGAC) sur le même cluster ou la même application EMR.

Étape 1 : Activer l'accès complet à la table dans Lake Formation

Pour utiliser le mode Full Table Access (FTA), vous devez autoriser les moteurs de requêtes tiers à accéder aux données sans la validation des balises de session IAM dans AWS Lake Formation. Pour l’activer, suivez les étapes de la section Intégration des applications pour un accès complet aux tables.

Note

Lorsque vous accédez à des tableaux multicomptes, l'accès complet aux tableaux doit être activé à la fois dans les comptes des producteurs et des consommateurs. De la même manière, lors de l'accès à des tableaux interrégionaux, ce paramètre doit être activé à la fois dans les régions productrices et consommatrices.

Étape 2 : configurer des autorisations IAM pour le rôle d’exécution des tâches

Pour accéder en lecture ou en écriture aux données sous-jacentes, outre les autorisations Lake Formation, un rôle d'exécution de tâche nécessite l'autorisation lakeformation:GetDataAccess IAM. Avec cette autorisation, Lake Formation accède à la demande d'informations d'identification temporaires pour accéder aux données.

Voici un exemple de politique expliquant comment fournir des autorisations IAM pour accéder à un script dans Amazon S3, télécharger des journaux vers S3, autoriser l'API AWS Glue et accéder à Lake Formation.

Étape 2.1 Configurer les autorisations de Lake Formation

  • Les tâches Spark qui lisent des données depuis S3 nécessitent l'autorisation Lake Formation SELECT.

  • Les tâches Spark dont write/delete les données se trouvent dans S3 nécessitent l'autorisation Lake Formation ALL (SUPER).

  • Les tâches Spark qui interagissent avec le catalogue Glue Data nécessitent les autorisations DESCRIBE, ALTER, DROP, selon les besoins.

Pour plus d'informations, reportez-vous à la section Octroi d'autorisations sur les ressources du catalogue de données.

Étape 3 : Initialiser une session Spark pour un accès complet à la table à l'aide de Lake Formation

Conditions préalables

AWS Le catalogue de données Glue doit être configuré en tant que métastore pour accéder aux tables de Lake Formation.

Définissez les paramètres suivants pour configurer le catalogue Glue en tant que métastore :

--conf spark.sql.catalogImplementation=hive --conf spark.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory

Pour plus d'informations sur l'activation du catalogue de données pour Amazon EMR sur EC2, consultez la section Configuration de Metastore pour Amazon EMR sur EC2.

Pour accéder aux tables enregistrées auprès de AWS Lake Formation, les configurations suivantes doivent être définies lors de l'initialisation de Spark afin de configurer Spark afin qu'il utilise les informations d'identification AWS Lake Formation.

Hive
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Iceberg
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=S3_DATA_LOCATION --conf spark.sql.catalog.spark_catalog.client.region=REGION --conf spark.sql.catalog.spark_catalog.type=glue --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Delta Lake
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Hudi
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.jars=/usr/lib/hudi/hudi-spark-bundle.jar --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog --conf spark.serializer=org.apache.spark.serializer.KryoSerializer
  • spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver: configurez le système de fichiers EMR (EMRFS) ou EMR S3A pour utiliser les informations d'identification S3 de Lake Formation pour les tables enregistrées par AWS Lake Formation. Si la table n’est pas enregistrée, utilisez les informations d’identification du rôle d’exécution de la tâche.

  • spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=trueet spark.hadoop.fs.s3.folderObject.autoAction.disabled=true : configurez EMRFS pour utiliser le type de contenu header application/x -directory au lieu du suffixe $folder$ lors de la création de dossiers S3. Cela est obligatoire lors de la lecture des tables Lake Formation, car les informations d'identification Lake Formation ne permettent pas de lire les dossiers de tables avec le suffixe $folder$.

  • spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true : configurez Spark pour ignorer la validation de l’emplacement vide de la table avant sa création. Cela est nécessaire pour les tables enregistrées par Lake Formation, car les informations d'identification Lake Formation permettant de vérifier l'emplacement vide ne sont disponibles qu'après la création de la table Glue Data Catalog. Sans cette configuration, les informations d’identification du rôle d’exécution de la tâche valideront l’emplacement de la table vide.

  • spark.sql.catalog.createDirectoryAfterTable.enabled=true : configurez Spark pour créer le dossier Amazon S3 après la création de la table dans le métastore Hive. Cela est obligatoire pour les tables enregistrées par Lake Formation, car les informations d'identification Lake Formation permettant de créer le dossier S3 ne sont disponibles qu'après la création de la table Glue Data Catalog.

  • spark.sql.catalog.dropDirectoryBeforeTable.enabled=true: configurez Spark pour supprimer le dossier S3 avant la suppression de la table dans le métastore Hive. Cela est nécessaire pour les tables enregistrées par Lake Formation, car les informations d'identification Lake Formation permettant de supprimer le dossier S3 ne sont pas disponibles après la suppression de la table du catalogue de données Glue.

  • spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true: configurez le catalogue Iceberg pour utiliser les informations d'identification S3 de AWS Lake Formation pour les tables enregistrées dans Lake Formation. Si la table n’est pas enregistrée, utilisez les informations d’identification d’environnement par défaut.

Configurer le mode d'accès complet aux tables dans SageMaker Unified Studio

Pour accéder aux tables enregistrées à Lake Formation à partir de sessions Spark interactives dans des JupyterLab blocs-notes, utilisez le mode d'autorisation de compatibilité. Utilisez la commande magique %%configure pour configurer votre configuration Spark. Choisissez la configuration en fonction de votre type de table :

For Hive tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true } }
For Iceberg tables
%%configure -f { "conf": { "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog", "spark.sql.catalog.spark_catalog.warehouse": "S3_DATA_LOCATION", "spark.sql.catalog.spark_catalog.client.region": "REGION", "spark.sql.catalog.spark_catalog.type": "glue", "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID", "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true", "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true", } }
For Delta Lake tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true } }
For Hudi tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true, "spark.jars": "/usr/lib/hudi/hudi-spark-bundle.jar", "spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension", "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog", "spark.serializer": "org.apache.spark.serializer.KryoSerializer" } }

Remplacez les espaces réservés :

  • S3_DATA_LOCATION: le chemin de votre bucket S3

  • REGION: AWS région (par exemple, us-est-1)

  • ACCOUNT_ID: votre identifiant AWS de compte

Note

Vous devez définir ces configurations avant d’exécuter des opérations Spark dans votre bloc-notes.

Opérations prises en charge

Ces opérations utiliseront les informations d'identification de AWS Lake Formation pour accéder aux données du tableau.

  • CREATE TABLE

  • ALTER TABLE

  • INSERT INTO

  • INSERT OVERWRITE

  • UPDATE

  • MERGE INTO

  • DELETE FROM

  • ANALYZE TABLE

  • REPAIR TABLE

  • DROP TABLE

  • Requêtes de source de données Spark

  • Écritures de source de données Spark

Note

Les opérations non répertoriées ci-dessus continueront à utiliser les autorisations IAM pour accéder aux données de la table.

Considérations

  • Si une table Hive est créée à l'aide d'une tâche pour laquelle l'accès complet à la table n'est pas activé et qu'aucun enregistrement n'est inséré, les lectures ou écritures suivantes à partir d'une tâche avec accès complet à la table échoueront. En effet, EMR Spark sans accès complet à la table ajoute le $folder$ suffixe au nom du dossier de la table. Pour résoudre cela, vous pouvez procéder comme suit :

    • Insérez au moins une ligne dans la table à partir d’une tâche pour laquelle FTA n’est pas activé.

    • Configurez la tâche pour laquelle FTA n'est pas activé pour ne pas utiliser de $folder$ suffixe dans le nom du dossier dans S3. Cela peut être réalisé en configurant spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true pour Spark.

    • Créez un dossier S3 à l'emplacement de la table à l's3://path/to/table/table_nameaide de la console AWS S3 ou de l'interface de ligne de commande AWS S3.

  • L'accès complet aux tables est pris en charge avec le système de fichiers EMR (EMRFS) à partir de la version 7.8.0 d'Amazon EMR et avec le système de fichiers S3A à partir de la version 7.10.0 d'Amazon EMR.

  • L'accès complet aux tables est pris en charge pour les tables Hive, Iceberg, Delta et Hudi.

  • Considérations relatives à la prise en charge de Hudi FTA Write :

    • Les écritures Hudi FTA nécessitent d'être utilisées HoodieCredentialedHadoopStorage pour la vente d'informations d'identification lors de l'exécution de la tâche. Définissez la configuration suivante lors de l'exécution des tâches Hudi : hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage

    • La prise en charge de l'écriture Full Table Access (FTA) pour Hudi est disponible à partir de la version 7.12 d'Amazon EMR.

    • La prise en charge de l'écriture Hudi FTA ne fonctionne actuellement qu'avec les configurations Hudi par défaut. Les paramètres Hudi personnalisés ou autres que ceux par défaut peuvent ne pas être entièrement pris en charge et peuvent entraîner un comportement inattendu.

    • Le clustering pour les tables Hudi Merge-On-Read (MOR) n'est pas pris en charge pour le moment en mode d'écriture FTA.

  • Les tâches faisant référence à des tables avec des règles de contrôle Fine-Grained d'accès à la formation des lacs (FGAC) ou des vues du catalogue de données Glue échoueront. Pour interroger une table avec des règles FGAC ou une vue du catalogue de données Glue, vous devez utiliser le mode FGAC. Vous pouvez activer le mode FGAC en suivant les étapes décrites dans la AWS documentation : Utilisation d'Amazon EMR sur EC2 avec AWS Lake Formation pour un contrôle d'accès précis.

  • L’accès complet aux tables ne prend pas en charge Spark Streaming.

  • Lorsque vous écrivez Spark DataFrame dans une table Lake Formation, seul le mode APPEND est pris en charge pour les tables Hive et Iceberg : df.write.mode("append").saveAsTable(table_name)

  • La création de tables externes nécessite des autorisations IAM.

  • Comme Lake Formation met temporairement en cache les informations d'identification dans une tâche Spark, une tâche par lots Spark ou une session interactive en cours d'exécution peut ne pas refléter les modifications d'autorisation.

  • Vous devez utiliser un rôle défini par l'utilisateur et non un rôle lié à un service : exigences de Lake Formation pour les rôles.

Support d'écriture Hudi FTA - Opérations prises en charge

Le tableau suivant indique les opérations d'écriture prises en charge pour les tables Hudi Copy-On-Write (COW) et Merge-On-Read (MOR) en mode Accès complet aux tables :

Opérations d'écriture prises en charge par Hudi FTA
Type de table Opération Commande SQL Write Statut
VACHE INSERT INSÉRER DANS LE TABLEAU Pris en charge
VACHE INSERT INSÉRER DANS LE TABLEAU - PARTITION (statique, dynamique) Pris en charge
VACHE INSERT INSERT OVERWRITE Pris en charge
VACHE INSERT INSERT OVERWRITE - PARTITION (statique, dynamique) Pris en charge
UPDATE UPDATE TABLEAU DE MISE À JOUR Pris en charge
VACHE UPDATE TABLEAU DE MISE À JOUR - Modifier la partition Non pris en charge
DELETE DELETE SUPPRIMER DU TABLEAU Pris en charge
ALTER ALTER MODIFIER LA TABLE - RENOMMER EN Non pris en charge
VACHE ALTER MODIFIER LA TABLE - DÉFINIR LES PROPRIÉTÉS DU TABLEAU Pris en charge
VACHE ALTER MODIFIER LA TABLE -- DÉSACTIVER LES PROPRIÉTÉS DU TABLEAU Pris en charge
VACHE ALTER MODIFIER LA TABLE - MODIFIER LA COLONNE Pris en charge
VACHE ALTER MODIFIER LA TABLE - AJOUTER DES COLONNES Pris en charge
VACHE ALTER MODIFIER LA TABLE - AJOUTER UNE PARTITION Pris en charge
VACHE ALTER MODIFIER LA TABLE - SUPPRIMER UNE PARTITION Pris en charge
VACHE ALTER ALTER TABLE - RÉCUPÉRER DES PARTITIONS Pris en charge
VACHE ALTER RÉPARER LES PARTITIONS DE SYNCHRONISATION DES TABLES Pris en charge
DROP DROP DROP TABLE Pris en charge
VACHE DROP TABLE DE DÉPÔT - PURGE Pris en charge
CREATE CREATE CRÉER UN TABLEAU - Géré Pris en charge
VACHE CREATE CRÉER UNE TABLE - PARTITIONNER PAR Pris en charge
VACHE CREATE CRÉER UNE TABLE SI ELLE N'EXISTE PAS Pris en charge
VACHE CREATE CREATE TABLE LIKE Pris en charge
VACHE CREATE CREATE TABLE AS SELECT Pris en charge
CREATE CREATE CRÉER UN TABLEAU avec EMPLACEMENT - Tableau externe Non pris en charge
DATAFRAME (INSÉRER) DATAFRAME (INSÉRER) enregistrer AsTable.Overwrite Pris en charge
VACHE DATAFRAME (INSÉRER) enregistrer AsTable.Append Non pris en charge
VACHE DATAFRAME (INSÉRER) enregistrer AsTable.Ignore Pris en charge
VACHE DATAFRAME (INSÉRER) enregistrer AsTable.ErrorIfExists Pris en charge
VACHE DATAFRAME (INSÉRER) save AsTable - Tableau externe (chemin) Non pris en charge
VACHE DATAFRAME (INSÉRER) enregistrer (chemin) - DF v1 Non pris en charge
MOR INSERT INSÉRER DANS LE TABLEAU Pris en charge
MOR INSERT INSÉRER DANS LE TABLEAU - PARTITION (statique, dynamique) Pris en charge
MOR INSERT INSERT OVERWRITE Pris en charge
MOR INSERT INSERT OVERWRITE - PARTITION (statique, dynamique) Pris en charge
UPDATE UPDATE TABLEAU DE MISE À JOUR Pris en charge
MOR UPDATE TABLEAU DE MISE À JOUR - Modifier la partition Non pris en charge
DELETE DELETE SUPPRIMER DU TABLEAU Pris en charge
ALTER ALTER MODIFIER LA TABLE - RENOMMER EN Non pris en charge
MOR ALTER MODIFIER LA TABLE - DÉFINIR LES PROPRIÉTÉS DU TABLEAU Pris en charge
MOR ALTER MODIFIER LA TABLE -- DÉSACTIVER LES PROPRIÉTÉS DU TABLEAU Pris en charge
MOR ALTER MODIFIER LA TABLE - MODIFIER LA COLONNE Pris en charge
MOR ALTER MODIFIER LA TABLE - AJOUTER DES COLONNES Pris en charge
MOR ALTER MODIFIER LA TABLE - AJOUTER UNE PARTITION Pris en charge
MOR ALTER MODIFIER LA TABLE - SUPPRIMER UNE PARTITION Pris en charge
MOR ALTER ALTER TABLE - RÉCUPÉRER DES PARTITIONS Pris en charge
MOR ALTER RÉPARER LES PARTITIONS DE SYNCHRONISATION DES TABLES Pris en charge
DROP DROP DROP TABLE Pris en charge
MOR DROP TABLE DE DÉPÔT - PURGE Pris en charge
CREATE CREATE CRÉER UN TABLEAU - Géré Pris en charge
MOR CREATE CRÉER UNE TABLE - PARTITIONNER PAR Pris en charge
MOR CREATE CRÉER UNE TABLE SI ELLE N'EXISTE PAS Pris en charge
MOR CREATE CREATE TABLE LIKE Pris en charge
MOR CREATE CREATE TABLE AS SELECT Pris en charge
CREATE CREATE CRÉER UN TABLEAU avec EMPLACEMENT - Tableau externe Non pris en charge
DATAFRAME (BOULEVERSÉ) DATAFRAME (BOULEVERSÉ) enregistrer AsTable.Overwrite Pris en charge
MOR DATAFRAME (BOULEVERSÉ) enregistrer AsTable.Append Non pris en charge
MOR DATAFRAME (BOULEVERSÉ) enregistrer AsTable.Ignore Pris en charge
MOR DATAFRAME (BOULEVERSÉ) enregistrer AsTable.ErrorIfExists Pris en charge
MOR DATAFRAME (BOULEVERSÉ) save AsTable - Tableau externe (chemin) Non pris en charge
MOR DATAFRAME (BOULEVERSÉ) enregistrer (chemin) - DF v1 Non pris en charge
DATAFRAME (SUPPRIMER) DATAFRAME (SUPPRIMER) enregistrer AsTable.Append Non pris en charge
MOR DATAFRAME (SUPPRIMER) save AsTable - Tableau externe (chemin) Non pris en charge
MOR DATAFRAME (SUPPRIMER) enregistrer (chemin) - DF v1 Non pris en charge
DATAFRAME (BULK_INSERT) DATAFRAME (BULK_INSERT) enregistrer AsTable.Overwrite Pris en charge
MOR DATAFRAME (BULK_INSERT) enregistrer AsTable.Append Non pris en charge
MOR DATAFRAME (BULK_INSERT) enregistrer AsTable.Ignore Pris en charge
MOR DATAFRAME (BULK_INSERT) enregistrer AsTable.ErrorIfExists Pris en charge
MOR DATAFRAME (BULK_INSERT) save AsTable - Tableau externe (chemin) Non pris en charge
MOR DATAFRAME (BULK_INSERT) enregistrer (chemin) - DF v1 Non pris en charge