View a markdown version of this page

Acceso completo a la tabla de Lake Formation para Amazon EMR en EC2 - 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.

Acceso completo a la tabla de Lake Formation para Amazon EMR en EC2

Con las versiones 7.8.0 y superiores de Amazon EMR, puede aprovechar AWS Lake Formation con Glue Data Catalog, donde el rol de ejecución del trabajo tiene todos los permisos de tabla sin las limitaciones de un control de acceso detallado. Esta capacidad le permite leer y escribir en tablas protegidas por Lake Formation desde los trabajos interactivos y por lotes de Amazon EMR en EC2 Spark. Consulte las siguientes secciones para obtener más información sobre Lake Formation y cómo usarlo con Amazon EMR en EC2.

Uso de Lake Formation con acceso completo a las tablas

Puede acceder a las tablas del catálogo de datos de Glue protegidas por AWS Lake Formation desde Amazon EMR en los trabajos de EC2 Spark o en las sesiones interactivas en las que el rol de ejecución del trabajo tenga acceso total a las tablas. No es necesario que habilite AWS Lake Formation en la aplicación Amazon EMR en EC2. Cuando un trabajo de Spark está configurado para el acceso total a las tablas (FTA), las credenciales de AWS Lake Formation se utilizan para los datos de read/write S3 de las tablas registradas de AWS Lake Formation, mientras que las credenciales de la función de tiempo de ejecución del trabajo se utilizan para read/write las tablas no registradas en Lake Formation. AWS

importante

No habilite AWS Lake Formation para un control de acceso detallado. Un trabajo no puede ejecutar simultáneamente el acceso completo a la tabla (FTA) y el control de Fine-Grained acceso (FGAC) en el mismo clúster o aplicación de EMR.

Paso 1: habilitación del acceso completo a las tablas en Lake Formation

Para usar el modo de acceso total a tablas (FTA), debe permitir que los motores de consulta de terceros accedan a los datos sin necesidad de validar las etiquetas de sesión de IAM en Lake Formation. AWS Para habilitarlo, siga los pasos descritos en Integración de aplicaciones para acceso completo a la tabla .

nota

Cuando se accede a tablas entre cuentas, se debe habilitar el acceso completo a las tablas tanto en las cuentas de productores como en las de consumidores. Del mismo modo, cuando se accede a las tablas entre regiones, esta configuración debe estar habilitada tanto en las regiones de productores como en las de consumidores.

Paso 2: configuración de los permisos de IAM para el rol en tiempo de ejecución del trabajo

Para acceder a los datos subyacentes, ya sea para lectura o escritura, además de los permisos de Lake Formation, el rol de tiempo de ejecución del trabajo necesita el permiso de IAM lakeformation:GetDataAccess. Con este permiso, Lake Formation concede la solicitud de credenciales temporales para acceder a los datos.

El siguiente es un ejemplo de política sobre cómo proporcionar permisos de IAM para acceder a un script en Amazon S3, cargar registros en S3, permisos de la API de AWS Glue y permiso para acceder a Lake Formation.

Paso 2.1: configuración de los permisos de Lake Formation

  • Los trabajos de Spark que leen datos desde S3 requieren el permiso SELECCIONAR de Lake Formation.

  • Spark afirma que write/delete los datos de S3 requieren el permiso ALL (SUPER) de Lake Formation.

  • Los trabajos de Spark que interactúan con el Catálogo de datos de Glue requieren los permisos DESCRIBIR, MODIFICAR o DESCARTAR, según corresponda.

Para obtener más información, consulte Granting permissions on Data Catalog resources.

Paso 3: inicialización de una sesión de Spark para el acceso completo a la tabla mediante Lake Formation

Requisitos previos

AWS El catálogo de datos de Glue debe configurarse como un metaalmacén para acceder a las tablas de Lake Formation.

Para configurar el catálogo de Glue como repositorio de metadatos, establezca la siguiente configuración:

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

Para obtener más información sobre cómo habilitar el catálogo de datos para Amazon EMR en EC2, consulte la configuración de Metastore para Amazon EMR en EC2.

Para acceder a las tablas registradas en AWS Lake Formation, es necesario establecer las siguientes configuraciones durante la inicialización de Spark para que Spark utilice las credenciales de Lake Formation. AWS

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: Configure el sistema de archivos EMR (EMRFS) o el EMR S3A para usar las credenciales S3 de Lake Formation en las tablas registradas de AWS Lake Formation. Si la tabla no está registrada, utilice las credenciales del rol en tiempo de ejecución del trabajo.

  • spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=trueyspark.hadoop.fs.s3.folderObject.autoAction.disabled=true: configure EMRFS para que utilice el tipo de contenido header application/x -directory en lugar del sufijo $folder$ al crear carpetas de S3. Esto es necesario para leer las tablas de Lake Formation, ya que las credenciales de Lake Formation no permiten leer carpetas de tablas que utilicen el sufijo $folder$.

  • spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true: configure Spark para omitir la validación de que la ubicación de la tabla esté vacía antes de crearla. Esto es necesario para las tablas registradas en Lake Formation, ya que las credenciales de Lake Formation necesarias para verificar que la ubicación esté vacía solo se encuentran disponibles después de crear la tabla de Catálogo de datos de Glue. Sin esta configuración, las credenciales del rol en tiempo de ejecución del trabajo validarán si la ubicación de la tabla está vacía.

  • spark.sql.catalog.createDirectoryAfterTable.enabled=true: configure Spark para crear la carpeta en Amazon S3 después de crear la tabla en el repositorio de metadatos de Hive. Esto es necesario para tablas registradas en Lake Formation, ya que las credenciales de Lake Formation necesarias para crear la carpeta en S3 solo se encuentran disponibles después de crear la tabla de Catálogo de datos de Glue.

  • spark.sql.catalog.dropDirectoryBeforeTable.enabled=true: configure Spark para descartar la carpeta en S3 antes de eliminar la tabla del repositorio de metadatos de Hive. Esto es necesario para las tablas registradas en Lake Formation, ya que las credenciales de Lake Formation para descartar la carpeta de S3 no están disponibles después de eliminar la tabla del Catálogo de datos de Glue.

  • spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true: Configure el catálogo de Iceberg para usar las credenciales S3 de Lake Formation para las AWS tablas registradas de Lake Formation. Si la tabla no está registrada, utilice las credenciales predeterminadas del entorno.

Configure el modo de acceso completo a la tabla en SageMaker Unified Studio

Para acceder a las tablas registradas de Lake Formation desde sesiones interactivas de Spark en JupyterLab cuadernos, usa el modo de permiso de compatibilidad. Use el comando mágico %%configure para configurar Spark. Elija la configuración según el tipo de tabla:

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" } }

Reemplace los marcadores de posición:

  • S3_DATA_LOCATION: la ruta de su bucket de S3

  • REGION: AWS región (p. ej., us-east-1)

  • ACCOUNT_ID: Su ID de cuenta AWS

nota

Debe establecer estas configuraciones antes de ejecutar cualquier operación de Spark en el bloc de notas.

Operaciones admitidas

Estas operaciones utilizarán las credenciales de AWS Lake Formation para acceder a los datos de la tabla.

  • CREATE TABLE

  • ALTER TABLE

  • INSERT INTO

  • INSERT OVERWRITE

  • UPDATE

  • MERGE INTO

  • DELETE FROM

  • ANALIZAR TABLA

  • REPARAR TABLA

  • DROP TABLE

  • Consultas de orígenes de datos de Spark

  • Escrituras de orígenes de datos de Spark

nota

Las operaciones no mencionadas anteriormente aún usan permisos de IAM para acceder a los datos de las tablas.

Consideraciones

  • Si una tabla de Hive se crea mediante un trabajo que no tiene habilitado el acceso completo a la tabla y no se insertan registros, las lecturas o escrituras posteriores desde un trabajo con acceso completo a la tabla fallarán. Esto se debe a que, cuando no tiene habilitado el acceso completo a la tabla, EMR Spark agrega el sufijo $folder$ al nombre de la carpeta de la tabla. Para resolver esto, puede optar por una de las siguientes acciones:

    • Insertar al menos una fila en la tabla desde un trabajo que no tenga FTA habilitado.

    • Configure el trabajo que no tiene FTA habilitado para evitar el uso del sufijo $folder$ en el nombre de la carpeta en S3. Esto se logra al configurar spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true en Spark.

    • Cree una carpeta S3 en la ubicación de la tabla s3://path/to/table/table_name mediante la consola AWS S3 o la CLI de AWS S3.

  • El acceso completo a las tablas es compatible con el sistema de archivos EMR (EMRFS) a partir de la versión 7.8.0 de Amazon EMR y con el sistema de archivos S3A a partir de la versión 7.10.0 de Amazon EMR.

  • El acceso completo a tablas es compatible con las tablas Hive, Iceberg, Delta y Hudi.

  • Consideraciones sobre la compatibilidad con Hudi FTA Write:

    • Hudi FTA escribe que requieren su uso para la venta de credenciales HoodieCredentialedHadoopStorage durante la ejecución del trabajo. Establezca la siguiente configuración cuando ejecute tareas de Hudi: hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage

    • La compatibilidad total de escritura con acceso a tablas (FTA) para Hudi está disponible a partir de la versión 7.12 de Amazon EMR.

    • La compatibilidad con escritura FTA de Hudi actualmente solo funciona con las configuraciones de Hudi predeterminadas. Los ajustes de Hudi personalizados o no predeterminados podrían no ser totalmente compatibles y podrían causar un comportamiento inesperado.

    • En este momento, no se admite la agrupación en clústeres de tablas Hudi Merge-On-Read (MOR) en el modo de escritura FTA.

  • Los trabajos que hagan referencia a tablas con reglas de control de Fine-Grained acceso a Lake Formation (FGAC) o vistas del catálogo de datos de Glue fallarán. Para consultar una tabla con reglas de FGAC o una vista del Catálogo de datos de Glue, debe usar el modo FGAC. Puede habilitar el modo FGAC siguiendo los pasos descritos en la AWS documentación: Uso de Amazon EMR en EC2 con AWS Lake Formation para un control de acceso detallado.

  • El acceso completo a tablas no ofrece compatibilidad con Spark Streaming.

  • Al escribir Spark en una tabla de Lake Formation, solo se admite el modo APPEND DataFrame para las tablas Hive e Iceberg: df.write.mode("append").saveAsTable(table_name)

  • La creación de tablas externas requiere permisos de IAM.

  • Como Lake Formation almacena temporalmente en caché las credenciales de un trabajo de Spark, es posible que los trabajos por lotes o las sesiones interactivas de Spark que se estén ejecutando no reflejen los cambios de permisos.

  • Debe utilizar un rol definido por el usuario, no uno vinculado a un servicio: Requisitos de Lake Formation en relación con los roles.

Soporte de escritura de Hudi FTA: operaciones compatibles

La siguiente tabla muestra las operaciones de escritura compatibles con las tablas Hudi Copy-On-Write (COW) y Merge-On-Read (MOR) en el modo de acceso total a la tabla:

Operaciones de escritura compatibles con Hudi FTA
Tipo de tabla Operación Comando de escritura SQL Status
VACA INSERT INSERT INTO TABLE compatible
VACA INSERT INSERTAR EN LA TABLA: PARTICIÓN (estática, dinámica) compatible
VACA INSERT INSERT OVERWRITE compatible
VACA INSERT INSERTAR Y SOBRESCRIBIR: PARTICIÓN (estática, dinámica) compatible
UPDATE UPDATE UPDATE TABLE compatible
VACA UPDATE TABLA DE ACTUALIZACIÓN: cambiar partición No es compatible
DELETE DELETE DELETE FROM TABLE compatible
ALTER ALTER ALTERAR TABLA: CAMBIAR EL NOMBRE A No es compatible
VACA ALTER ALTERAR TABLA - ESTABLECER PROPIEDADES DE TABLA compatible
VACA ALTER MODIFICAR TABLA - DESACTIVAR LAS PROPIEDADES DE LA TABLA compatible
VACA ALTER ALTERAR TABLA - ALTERAR COLUMNA compatible
VACA ALTER ALTERAR TABLA: AGREGAR COLUMNAS compatible
VACA ALTER ALTERAR TABLA - AGREGAR PARTICIÓN compatible
VACA ALTER ALTERAR TABLA - ELIMINAR PARTICIÓN compatible
VACA ALTER ALTERAR TABLA: RECUPERAR PARTICIONES compatible
VACA ALTER REPARAR PARTICIONES DE SINCRONIZACIÓN DE TABLAS compatible
DROP DROP DROP TABLE compatible
VACA DROP DROP TABLE - PURGAR compatible
CREATE CREATE CREAR TABLA: Administrado compatible
VACA CREATE CREAR TABLA: PARTICIONAR POR compatible
VACA CREATE CREAR TABLA SI NO EXISTE compatible
VACA CREATE CREATE TABLE LIKE compatible
VACA CREATE CREATE TABLE AS SELECT compatible
CREATE CREATE CREAR TABLA con UBICACIÓN: tabla externa No es compatible
MARCO DE DATOS (INSERTAR) MARCO DE DATOS (INSERTAR) guardar AsTable.Overwrite compatible
VACA MARCO DE DATOS (INSERTAR) guardar AsTable.Append No es compatible
VACA MARCO DE DATOS (INSERTAR) guardar AsTable.Ignore compatible
VACA MARCO DE DATOS (INSERTAR) guardar AsTable.ErrorIfExists compatible
VACA MARCO DE DATOS (INSERTAR) guardar AsTable - Tabla externa (Ruta) No es compatible
VACA MARCO DE DATOS (INSERTAR) guardar (ruta) - DF v1 No es compatible
MÁS INSERT INSERT INTO TABLE compatible
MÁS INSERT INSERTAR EN LA TABLA: PARTICIÓN (estática, dinámica) compatible
MÁS INSERT INSERT OVERWRITE compatible
MÁS INSERT INSERTAR Y SOBRESCRIBIR: PARTICIÓN (estática, dinámica) compatible
UPDATE UPDATE UPDATE TABLE compatible
MÁS UPDATE TABLA DE ACTUALIZACIÓN: cambiar partición No es compatible
DELETE DELETE DELETE FROM TABLE compatible
ALTER ALTER ALTERAR TABLA: CAMBIAR EL NOMBRE A No es compatible
MÁS ALTER ALTERAR TABLA - ESTABLECER PROPIEDADES DE TABLA compatible
MÁS ALTER ALTERAR TABLA - DESESTABLECER LAS PROPIEDADES DE LA TABLA compatible
MÁS ALTER ALTERAR TABLA - ALTERAR COLUMNA compatible
MÁS ALTER ALTERAR TABLA: AGREGAR COLUMNAS compatible
MÁS ALTER ALTERAR TABLA: AGREGAR PARTICIÓN compatible
MÁS ALTER ALTERAR TABLA - ELIMINAR PARTICIÓN compatible
MÁS ALTER ALTERAR TABLA: RECUPERAR PARTICIONES compatible
MÁS ALTER REPARAR PARTICIONES DE SINCRONIZACIÓN DE TABLAS compatible
DROP DROP DROP TABLE compatible
MÁS DROP DROP TABLE - PURGAR compatible
CREATE CREATE CREAR TABLA: Administrado compatible
MÁS CREATE CREAR TABLA: PARTICIONAR POR compatible
MÁS CREATE CREAR TABLA SI NO EXISTE compatible
MÁS CREATE CREATE TABLE LIKE compatible
MÁS CREATE CREATE TABLE AS SELECT compatible
CREATE CREATE CREAR TABLA con UBICACIÓN: tabla externa No es compatible
MARCO DE DATOS (ALTERADO) MARCO DE DATOS (UPSERT) guardar AsTable.Overwrite compatible
MÁS MARCO DE DATOS (ALTERADO) guardar AsTable.Append No es compatible
MÁS MARCO DE DATOS (ALTERADO) guardar AsTable.Ignore compatible
MÁS MARCO DE DATOS (ALTERADO) guardar AsTable.ErrorIfExists compatible
MÁS MARCO DE DATOS (ALTERADO) guardar AsTable - Tabla externa (ruta) No es compatible
MÁS MARCO DE DATOS (ALTERADO) guardar (ruta) - DF v1 No es compatible
MARCO DE DATOS (ELIMINAR) MARCO DE DATOS (ELIMINAR) guardar AsTable.Append No es compatible
MÁS MARCO DE DATOS (ELIMINAR) guardar AsTable - Tabla externa (ruta) No es compatible
MÁS MARCO DE DATOS (ELIMINAR) guardar (ruta) - DF v1 No es compatible
MARCO DE DATOS (BULK_INSERT) MARCO DE DATOS (BULK_INSERT) guardar AsTable.Overwrite compatible
MÁS MARCO DE DATOS (BULK_INSERT) guardar AsTable.Append No es compatible
MÁS MARCO DE DATOS (BULK_INSERT) guardar AsTable.Ignore compatible
MÁS MARCO DE DATOS (BULK_INSERT) guardar AsTable.ErrorIfExists compatible
MÁS MARCO DE DATOS (BULK_INSERT) guardar AsTable - Tabla externa (ruta) No es compatible
MÁS MARCO DE DATOS (BULK_INSERT) guardar (ruta) - DF v1 No es compatible