Uso de Athena para consultar conjuntos de datos de Apache Hudi - Amazon Athena

Uso de Athena para consultar conjuntos de datos de Apache Hudi

Apache Hudi es un marco de administración de datos de código abierto que simplifica el procesamiento incremental de datos. Las acciones de inserción, actualización, upsert y eliminación a nivel de registro se procesan de manera mucho más pormenorizada, lo que reduce la sobrecarga. Upsert se refiere a la capacidad de insertar registros en un conjunto de datos si aún no existen o de actualizarlos en caso de que ya estén presentes.

Hudi gestiona los eventos de inserción y actualización de datos sin crear muchos archivos pequeños que pueden causar problemas de rendimiento para el análisis. Apache Hudi realiza un seguimiento automático de los cambios y fusiona los archivos, para que permanezcan en un tamaño óptimo. Esto evita la necesidad de crear soluciones personalizadas que monitoreen y reescriban muchos archivos pequeños en menos archivos grandes.

Los conjuntos de datos de Hudi son adecuados para los siguientes casos de uso:

Los conjuntos de datos administrados por Hudi se almacenan en Amazon S3 mediante formatos de almacenamiento abierto. Actualmente, Athena puede leer conjuntos de datos Hudi compactados, pero no puede escribir datos Hudi. Athena admite hasta la versión 0.8.0 de Hudi con la versión 2 del motor de Athena, y hasta la versión 0.14.0 de Hudi con la versión 3 del motor de Athena. Esto está sujeto a cambios. Athena no puede garantizar la compatibilidad de lectura con tablas que se hayan creado con versiones posteriores de Hudi. Para obtener más información acerca del control de versiones del motor Athena, consulte Control de versiones del motor Athena. Para obtener más información sobre las características y el control de versiones de Hudi, consulte la documentación de Hudi en el sitio web de Apache.

Tipos de tablas de los conjuntos de datos de Hudi

Un conjunto de datos de Hudi puede tratarse de uno de los siguientes tipos:

  • Copiar al escribir (CoW, Copy on Write): los datos se almacenan en un formato de columnas (Parquet) y cada actualización crea una nueva versión de los archivos durante una escritura.

  • Fusionar al leer (MoR, Merge on Read): los datos se almacenan utilizando un formato que combina columnas (Parquet) y filas (Avro). Las actualizaciones se registran en archivos delta basados en filas y se compactan según sea necesario para crear nuevas versiones de los archivos en columnas.

Con los datasets de tipo CoW, cada vez que se produce una actualización de un registro, el archivo que contiene el registro se vuelve a escribir con los valores actualizados. Con un conjunto de datos de tipo MoR, cada vez que hay una actualización, Hudi escribe solo la fila correspondiente al registro modificado. MoR es más adecuado para cargas de trabajo con gran cantidad de escrituras o cambios y menos lecturas. CoW es más adecuado para cargas de trabajo con gran cantidad de lecturas con datos que cambian con menos frecuencia.

Hudi ofrece tres tipos de consulta para acceder a los datos:

  • Consultas de instantáneas: consultas que ven la última instantánea de la tabla a partir de una acción de confirmación o compactación determinada. Para las tablas MoR, las consultas de instantáneas exponen el estado más reciente de la tabla mediante la combinación de los archivos base y delta del segmento de archivos más reciente en el momento de la consulta.

  • Consultas progresivas: consultas que solo ven los nuevos datos escritos en la tabla, desde una confirmación o compactación determinada. Esto proporciona flujos de cambio de manera efectiva para habilitar canalizaciones de datos incrementales.

  • Consultas optimizadas para lectura: para las tablas de MoR, las consultas ven compactados los datos más recientes. Para las tablas CoW, las consultas ven los últimos datos confirmados.

En la siguiente tabla, se muestran los tipos de consulta Hudi posibles para cada tipo de tabla.

Tipo de tabla Tipos de consultas posibles de Hudi
Copiar al escribir Instantánea, incremental
Fusionar al leer instantánea, incremental, lectura optimizada

Actualmente, Athena admite consultas de instantáneas y consultas optimizadas de lectura, pero no consultas incrementales. En las tablas MoR, todos los datos expuestos a consultas optimizadas de lectura están compactados. Esto proporciona un buen rendimiento, pero no incluye las últimas confirmaciones delta. Las consultas instantáneas contienen los datos más recientes, pero generan alguna sobrecarga informática, lo que hace que estas consultas sean menos eficientes.

Para obtener más información acerca de las ventajas e inconvenientes de los tipos de tablas y consultas, visite Tipos de tablas y de consultas en la documentación de Apache Hudi.

Cambio de la terminología de Hudi: las vistas ahora son consultas

A partir de la versión 0.5.1, Apache Hudi cambió parte de su terminología. Lo que antes eran vistas se denominan consultas en versiones posteriores. En la siguiente tabla, se resumen los cambios entre los términos anteriores y los nuevos.

Término antiguo Término nuevo

CoW: vista optimizada de lectura

MoR: vista en tiempo real

Consultas de instantáneas

Vista incremental Consulta incremental
MoR: vista optimizada de lectura Consulta optimizada de lectura

Tablas de operación de Bootstrap

A partir de la versión 0.6.0 de Apache Hudi, la característica de operación de arranque proporciona un mejor rendimiento con los conjuntos de datos de Parquet existentes. En lugar de volver a escribir el conjunto de datos, una operación de arranque solo puede generar metadatos, lo que deja el conjunto de datos como está.

Athena se puede utilizar para consultar tablas desde una operación de arranque al igual que otras tablas basadas en datos de Amazon S3. En la instrucción CREATE TABLE, especifique la ruta de la tabla Hudi en la cláusula LOCATION.

Para obtener más información sobre cómo crear tablas Hudi mediante la operación de arranque en Amazon EMR, consulte el artículo Nuevas características de Apache Hudi disponibles en Amazon EMR en el Blog de macrodatos de AWS.

Lista de metadatos de Hudi

Apache Hudi tiene una tabla de metadatos que contiene características de indexación para mejorar el rendimiento, como la lista de archivos, la omisión de datos mediante estadísticas de columnas y un índice basado en un filtro de Bloom.

En la actualidad, de estas características, Athena solo admite el índice de listas de archivos. El índice de listas de archivos elimina las llamadas al sistema de archivos, como aquellas destinadas a “enumerar archivos”, ya que obtiene la información de un índice que mantiene una partición para asignar los archivos. Esto elimina la necesidad de enumerar de forma recursiva todas y cada una de las particiones en la ruta de la tabla para obtener una vista del sistema de archivos. Al trabajar con conjuntos de datos de gran tamaño, esta indexación reduce de forma drástica la latencia que, de otro modo, se produciría al obtener la lista de archivos durante las escrituras y consultas. También evita cuellos de botella, como la limitación de los límites de solicitudes en las llamadas LIST de Amazon S3.

nota

Athena no admite la omisión de datos ni la indexación del filtro de Bloom en este momento.

Habilitación de la tabla de metadatos de Hudi

La lista de archivos basada en tablas de metadatos se encuentra deshabilitada de forma predeterminada. Para habilitar la tabla de metadatos de Hudi y la funcionalidad de lista de archivos relacionada, defina la propiedad de la tabla hudi.metadata-listing-enabled en TRUE.

Ejemplo

En el siguiente ejemplo de ALTER TABLE SET TBLPROPERTIES, se habilita la tabla de metadatos de la tabla partition_cow de ejemplo.

ALTER TABLE partition_cow SET TBLPROPERTIES('hudi.metadata-listing-enabled'='TRUE')

Consideraciones y limitaciones

  • Athena no admite consultas incrementales.

  • Athena no es compatible con CTAS o INSERT INTO sobre los datos de Hudi. Si desea soporte de Athena para escribir conjuntos de datos de Hudi, envíe sus comentarios a .

    Para obtener más información sobre cómo escribir datos de Hudi, consulte los siguientes recursos:

  • El uso de MSCK REPAIR TABLE en tablas Hudi en Athena no es compatible. Si necesita cargar una tabla Hudi no creada en AWS Glue, utilice ALTER TABLE ADD PARTITION.

  • No se admite la omisión de objetos de S3 Glacier: si los objetos de la tabla de Apache Hudi se encuentran en una clase de almacenamiento de Amazon S3 Glacier, establecer la propiedad de la tabla read_restored_glacier_objects en false no tendrá ningún efecto.

    Suponga, por ejemplo, que ejecuta el siguiente comando:

    ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')

    En el caso de las tablas de Iceberg y Delta Lake, el comando produce el error Clave de propiedad de tabla no compatible: read_restored_glacier_objects. En el caso de las tablas de Hudi, el comando ALTER TABLE no produce ningún error, pero los objetos de Amazon S3 Glacier siguen sin omitirse. Al ejecutar consultas SELECT después del comando ALTER TABLE, se siguen devolviendo todos los objetos.

Recursos adicionales de

Para consultar recursos adicionales sobre la utilización de Apache Hudi con Athena, consulte los siguientes recursos.

Video

En el siguiente video se muestra cómo puede utilizar Amazon Athena para consultar un conjunto de datos de Apache Hudi optimizado para lectura en su lago de datos basado en Amazon S3.

Publicaciones de blog

Las siguientes publicaciones en el blog sobre Big Data de AWS incluyen descripciones de cómo utilizar Apache Hudi con Athena.

Creación de tablas de Hudi

En esta sección se proporcionan ejemplos de instrucciones CREATE TABLE en Athena para tablas particionadas y no particionadas de datos Hudi.

Si ya tiene tablas Hudi creadas en AWS Glue, puede consultarlas directamente en Athena. Cuando se crean tablas de Hudi particionadas en Athena, se debe ejecutar ALTER TABLE ADD PARTITION para cargar los datos de Hudi antes de poder consultarlos.

Crear tablas de ejemplo de copiar al escribir (CoW)

Tabla CoW no particionada

En el siguiente ejemplo, se crea una tabla CoW sin particiones en Athena.

CREATE EXTERNAL TABLE `non_partition_cow`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/non_partition_cow/'

Tabla CoW particionada

En el siguiente ejemplo, se crea una tabla CoW particionada en Athena.

CREATE EXTERNAL TABLE `partition_cow`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_cow/'

El ejemplo a continuación de ALTER TABLE ADD PARTITION agrega dos particiones a la tabla de ejemplo partition_cow.

ALTER TABLE partition_cow ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_cow/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_cow/two/'

Crear tablas de ejemplo de fusionar al leer (MoR)

Hudi crea dos tablas en el metaalmacén de MoR: una tabla para consultas de instantáneas y una tabla para consultas optimizadas de lectura. Ambas tablas se pueden consultar. En versiones de Hudi anteriores a 0.5.1, la tabla para consultas optimizadas de lectura tenía el nombre que había especificado al crear la tabla. A partir de la versión 0.5.1 de Hudi, el nombre de la tabla tiene el sufijo con _ro de forma predeterminada. El nombre de la tabla para las consultas de instantáneas es el nombre que especificó, al que se le agrega _rt.

Tabla de fusionar al leer (MoR) no particionada

En el siguiente ejemplo, se crea una tabla MoR no particionada en Athena para consultas optimizadas de lectura. Tenga en cuenta que las consultas optimizadas de lectura utilizan el formato de entrada HoodieParquetInputFormat.

CREATE EXTERNAL TABLE `nonpartition_mor`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/nonpartition_mor/'

En el siguiente ejemplo, se crea una tabla MoR no particionada en Athena para consultas de instantáneas. Para consultas de instantáneas, utilice el formato de entrada HoodieParquetRealtimeInputFormat.

CREATE EXTERNAL TABLE `nonpartition_mor_rt`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int, `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/nonpartition_mor/'

Tabla de fusionar al leer (MoR) particionada

En el siguiente ejemplo se crea una tabla MoR particionada en Athena para consultas optimizadas de lectura.

CREATE EXTERNAL TABLE `partition_mor`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.HoodieParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/'

El ejemplo a continuación de ALTER TABLE ADD PARTITION agrega dos particiones a la tabla de ejemplo partition_mor.

ALTER TABLE partition_mor ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/two/'

En el ejemplo siguiente se crea una tabla MoR particionada en Athena para consultas de instantáneas.

CREATE EXTERNAL TABLE `partition_mor_rt`( `_hoodie_commit_time` string, `_hoodie_commit_seqno` string, `_hoodie_record_key` string, `_hoodie_partition_path` string, `_hoodie_file_name` string, `event_id` string, `event_time` string, `event_name` string, `event_guests` int) PARTITIONED BY ( `event_type` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hudi.hadoop.realtime.HoodieParquetRealtimeInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/'

Del mismo modo, el ejemplo a continuación de ALTER TABLE ADD PARTITION agrega dos particiones a la tabla de ejemplo partition_mor_rt.

ALTER TABLE partition_mor_rt ADD PARTITION (event_type = 'one') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://DOC-EXAMPLE-BUCKET/folder/partition_mor/two/'

Recursos adicionales de