Utilizzo di Athena per eseguire query sui set di dati Apache Hudi - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di Athena per eseguire query sui set di dati Apache Hudi

Apache Hudi è un framework open source per la gestione dei dati che semplifica l'elaborazione incrementale dei dati. Le operazioni di inserimento, aggiornamento, upsert ed eliminazione a livello di registro vengono elaborate in modo molto più granulare, riducendo il sovraccarico. Upsert si riferisce alla possibilità di inserire registri in un set di dati esistente se non esistono già o di aggiornarli.

Hudi gestisce gli eventi di inserimento e aggiornamento dei dati senza creare molti file di piccole dimensioni che possono causare problemi di prestazioni per l'analisi. Apache Hudi tiene traccia automaticamente delle modifiche e unisce i file in modo che abbiano dimensioni ottimali. Ciò evita la necessità di creare soluzioni personalizzate in grado di monitorare e riscrivere molti file di piccole dimensioni in meno file di grandi dimensioni.

I set di dati Hudi sono adatti per i seguenti casi d'uso:

I set di dati gestiti da Hudi sono archiviati in Amazon S3 tramite formati di archiviazione aperti. Attualmente, Athena può leggere set di dati Hudi compattati ma non scrivere dati Hudi. Athena supporta fino alla versione 0.8.0 di Hudi con la versione 2 del motore Athena e la versione 0.14.0 di Hudi con la versione 3 del motore Athena. È soggetta a modifiche. Athena non può garantire la compatibilità di lettura con le tabelle create con versioni successive di Hudi. Per ulteriori informazioni sulle versioni del motore Athena, consulta Controllo delle versioni del motore di Athena. Per ulteriori informazioni sulle funzionalità e sul controllo delle versioni di Hudi, consulta la documentazione di Hudi sul sito Web di Apache.

Tipi di tabella set di dati Hudi

Un set di dati Hudi può essere tra i seguenti tipi:

  • Copia in scrittura (CoW): i dati vengono memorizzati in un formato colonnare (Parquet) e ogni aggiornamento crea una nuova versione dei file durante una scrittura.

  • Unisci in lettura (MoR) — I dati vengono archiviati utilizzando una combinazione di formati a colonne (Parquet) e basati su righe (Avro). Gli aggiornamenti vengono registrati nei file delta basati su righe e vengono compattati in base alle necessità per creare nuove versioni dei file colonnari.

Con i set di dati CoW, ogni volta che c'è un aggiornamento a un record, il file che contiene il record viene riscritto con i valori aggiornati. Quando si lavora con un set di dati MoR, ogniqualvolta è disponibile un aggiornamento Hudi scrive solo la riga per il registro modificato. MoR è più adatto per carichi di lavoro pesanti in scrittura o modifiche con meno letture. CoW è più adatto per carichi di lavoro pesanti di lettura su dati che cambiano meno frequentemente.

Hudi fornisce tre tipi di query per accedere ai dati:

  • Query snapshot: query che vedono l'ultima snapshot della tabella a partire da una determinata operazione di commit o compattazione. Per le tabelle MoR, le query snapshot espongono lo stato più recente della tabella unendo i file di base e delta della parte di file più recente al momento della query.

  • Query incrementali: le query vedono solo i nuovi dati scritti nella tabella, dal momento di un determinato commit/compattazione. Questo fornisce in modo efficace flussi di modifica per abilitare pipeline di dati incrementali.

  • Leggi query ottimizzate: per le tabelle MoR, le query vedono i dati più recenti compattati. Per le tabelle CoW, le query vedono i dati più recenti impegnati.

Nella tabella seguente vengono illustrati i possibili tipi di query Hudi per ciascun tipo di tabella.

Tipo tabella Possibili tipi di query Hudi
Copia in scrittura snapshot, incrementale
Unisci in lettura snapshot, incrementale, lettura ottimizzata

Attualmente, Athena supporta query snapshot e query di lettura ottimizzate, ma non query incrementali. Sulle tabelle MoR, tutti i dati esposti a query ottimizzate di lettura sono compattati. Ciò fornisce buone prestazioni ma non include i commit delta più recenti. Le query snapshot contengono i dati più aggiornati ma incorrono in un sovraccarico computazionale che rende queste query meno performanti.

Per ulteriori informazioni sui compromessi tra i tipi di tabella e query, consulta Tipi di tabella e query nella documentazione di Apache Hudi.

Cambiamento terminologico Hudi: le viste sono ora query

A partire dal rilascio della versione 0.5.1, Apache Hudi ha cambiato parte della sua terminologia. Quelle che erano precedentemente viste sono chiamate query nei rilasci successivi. Nella tabella seguente vengono riepilogate le modifiche tra i termini precedenti e quelli nuovi.

Vecchio termine Nuovo termine

CoW: visualizzazione ottimizzata per la lettura

MoR: visualizzazione in tempo reale

Query snapshot

Visualizzazione incrementale Query incrementale
Visualizzazione ottimizzata per la lettura MoR Query ottimizzata per la lettura

Tabelle dell'operazione Bootstrap

A partire da Apache Hudi v. 0.6.0, la funzione dell'operazione Bootstrap fornisce prestazioni migliori con i set di dati Parquet esistenti. Invece di riscrivere il set di dati, un'operazione Bootstrap può generare solo metadati, lasciando il set di dati in posizione.

Puoi usare Athena per interrogare le tabelle da un'operazione Bootstrap proprio come altre tabelle basate sui dati in Amazon S3. Nell'istruzione CREATE TABLE, specifica il percorso della tabella Hudi nella clausola LOCATION.

Per ulteriori informazioni sulla creazione di tabelle Hudi utilizzando l'operazione di bootstrap in Amazon EMR, consulta l'articolo Nuove funzionalità di Apache Hudi disponibili in Amazon EMR nel Big Data Blog. AWS

Elenco dei metadati Hudi

Apache Hudi dispone di una tabella di metadati contenente funzionalità di indicizzazione per migliorare le prestazioni, come l'elenco dei file, il salto dei dati utilizzando le statistiche delle colonne e un indice basato sul filtro Bloom.

Di queste funzionalità Athena attualmente supporta solo l'indice di elenco dei file. L'indice di elenco dei file elimina le chiamate al file system come "list files" recuperando le informazioni da un indice che mantiene una mappatura tra partizione e file. Ciò rimuove il bisogno di elencare in modo ricorsivo ogni singola partizione nel percorso della tabella per avere una visualizzazione del file system. Quando utilizzi set di dati di grandi dimensioni, questa indicizzazione riduce drasticamente la latenza che altrimenti si verificherebbe quando si ottiene l'elenco dei file durante la scrittura e le query. Inoltre, evita colli di bottiglia come restrizioni di limiti di richiesta nelle chiamate LIST Amazon S3.

Nota

Al momento Athena non supporta il salto dei dati o l'indicizzazione del filtro Bloom.

Abilitazione della tabella di metadati Hudi

Per impostazione predefinita, l'elenco dei file basato su tabelle di metadati è disabilitato. Per abilitare la tabella di metadati Hudi e la relativa funzionalità di elenco dei file, imposta la proprietà della tabella hudi.metadata-listing-enabled su TRUE.

Esempio

L'esempio ALTER TABLE SET TBLPROPERTIES seguente abilita la tabella di metadati nella tabella di esempio partition_cow.

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

Considerazioni e limitazioni

  • Athena non supporta query incrementali.

  • Athena non supporta CTAS o INSERT INTO per i dati Hudi. Se desideri il supporto Athena per la scrittura di dataset Hudi, invia un feedback ad .

    Per ulteriori informazioni sulla scrittura di dati Hudi, vedere le seguenti risorse:

  • L'utilizzo di MSCK REPAIR TABLE sulle tabelle Hudi in Athena non è supportato. Se devi caricare una tabella Hudi non creata in, usa. AWS GlueALTER TABLE ADD PARTITION

  • Ignorare gli oggetti S3 Glacier non supportati: se gli oggetti nella tabella Apache Hudi si trovano in una classe di archiviazione Amazon S3 Glacier, l'impostazione della proprietà della tabella read_restored_glacier_objects su false non ha alcun effetto.

    Ad esempio, supponiamo di emettere il seguente comando:

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

    Per le tabelle Iceberg e Delta Lake, il comando produce l'errore Chiave delle proprietà della tabella non supportata: read_restored_glacier_objects. Per le tabelle Hudi, il comando ALTER TABLE non produce un errore, ma gli oggetti Amazon S3 Glacier ancora non verranno ignorati. L'esecuzione delle query SELECT dopo il comando ALTER TABLE continuerà a restituire tutti gli oggetti.

Risorse aggiuntive

Per ulteriori risorse sull'utilizzo di Apache Hudi con Athena, consulta le seguenti risorse.

Video

Il video seguente mostra come puoi usare Amazon Athena per interrogare un dataset Apache Hudi ottimizzato per la lettura nel tuo data lake basato su Amazon S3.

Post del blog

I seguenti post del blog AWS Big Data includono descrizioni di come utilizzare Apache Hudi con Athena.

Creazione di tabelle Hudi

Questa sezione fornisce esempi di istruzioni CREATE TABLE in Athena per tabelle partizionate e non partizionate di dati Hudi.

Se hai già delle tabelle Hudi create in AWS Glue, puoi interrogarle direttamente in Athena. Quando crei tabelle partizionate Hudi in Athena, è necessario eseguire ALTER TABLE ADD PARTITION per caricare i dati Hudi prima di poterli interrogare.

Esempi di creazione di tabelle Copia su scrittura (CoW)

Tabella CoW non partizionata

L'esempio seguente crea una tabella CoW non partizionata in 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/'

Tabella CoW partizionata

L'esempio seguente crea una tabella CoW partizionata in 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/'

Il seguente esempio ALTER TABLE ADD PARTITION aggiunge due partizioni all'esempio di tabella 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/'

Esempi di creazione di tabelle Unisci in lettura (MoR)

Hudi crea due tabelle nel metastore per MoR: una tabella per le query snapshot e una tabella per le query ottimizzate per la lettura. Entrambe le tabelle sono interrogabili. Nelle versioni Hudi precedenti alla 0.5.1, la tabella per le query ottimizzate per la lettura aveva il nome specificato al momento della creazione della tabella. A partire da Hudi versione 0.5.1, al nome della tabella viene aggiunto il suffisso _ro per impostazione predefinita. Il nome della tabella per le query snapshot è il nome specificato seguito da _rt.

Tabella Unisci in lettura (MoR) non partizionata

L'esempio seguente crea una tabella MoR non partizionata in Athena per le query ottimizzate per la lettura. Le query ottimizzate di lettura utilizzano il formato di input 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/'

L'esempio seguente crea una tabella MoR non partizionata in Athena per le query snapshot. Per le query snapshot, utilizzare il formato di input 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/'

Tabella Unisci in lettura (MoR) partizionata

L'esempio seguente crea una tabella MoR partizionata in Athena per le query ottimizzate per la lettura.

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/'

Il seguente esempio ALTER TABLE ADD PARTITION aggiunge due partizioni all'esempio di tabella 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/'

L'esempio seguente crea una tabella MoR partizionata in Athena per le query snapshot.

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/'

Analogamente, il seguente esempio ALTER TABLE ADD PARTITION aggiunge due partizioni all'esempio di tabella 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/'

Risorse aggiuntive