Uso de Athena para consultar conjuntos de datos de Apache Hudi
Apache HudiUpsert
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:
-
Cumplir con las regulaciones de privacidad, como el Reglamento General de Protección de Datos
(RGPD) y la Ley de Privacidad del Consumidor de California (CCPA) que velan por el derecho de las personas a eliminar su información personal o cambiar la forma en que se utilizan sus datos. -
Trabajo con datos transmitidos en streaming desde sensores y otros dispositivos del Internet de las cosas (IoT) que requieren eventos específicos de inserción y actualización de datos.
-
Implementar un sistema de captura de datos modificados (CDC, change data capture)
.
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 Athena, y la versión 0.10.1 de Hudi con la versión 3 del motor 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 funciones y el control de versiones de Hudi, consulte la documentación de Hudi
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
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 New features from Apache Hudi available in Amazon EMR
Condiciones 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
<athena-feedback@amazon.com>
.Para obtener más información sobre cómo escribir datos de Hudi, consulte los siguientes recursos:
-
Uso del conjunto de datos de Hudi en la Guía de publicación de Amazon EMR
-
Escritura de datos
en la documentación de Apache Hudi.
-
-
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.
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.
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://
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://
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://
bucket
/folder
/partition_cow/one/' PARTITION (event_type = 'two') LOCATION 's3://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://
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://
bucket
/folder
/nonpartition_mor'
Tabla de fusionar al leer (MoR) particionada
En el ejemplo siguiente 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://
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://
bucket
/folder
/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://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://
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://
bucket
/folder
/partition_mor/one/' PARTITION (event_type = 'two') LOCATION 's3://bucket
/folder
/partition_mor/two/'
Véase también
Para obtener información sobre cómo utilizar conectores personalizados de AWS Glue y trabajos de AWS Glue 2.0 para crear una tabla de Apache Hudi que se pueda consultar con Athena, consulte Writing to Apache Hudi tables using AWS Glue custom connector