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 HudiUpsert
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:
-
il rispetto delle normative sulla privacy come il Regolamento generale sulla protezione dei dati
(GDPR) e la Legge sulla privacy dei consumatori della California (CCPA), che danno alle persone il diritto di rimuovere le informazioni personali o di modificare il modo in cui vengono utilizzati i loro dati. -
Utilizzo di dati in streaming da sensori e altri dispositivi IoT (Internet of Things) che richiedono specifici eventi di inserimento e aggiornamento dei dati.
-
Implementazione di un sistema di acquisizione dei dati di modifica o change data capture (CDC)
.
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
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
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
Elenco dei metadati Hudi
Apache Hudi dispone di una tabella di metadati
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
<athena-feedback@amazon.com>
.Per ulteriori informazioni sulla scrittura di dati Hudi, vedere le seguenti risorse:
-
Utilizzo di un set di dati Hudi nella Guida al rilascio di Amazon EMR.
-
Scrittura di dati
nella documentazione di Apache Hudi.
-
-
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
sufalse
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 comandoALTER TABLE
non produce un errore, ma gli oggetti Amazon S3 Glacier ancora non verranno ignorati. L'esecuzione delle querySELECT
dopo il comandoALTER 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
-
Per informazioni sull'utilizzo di connettori AWS Glue personalizzati e processi AWS Glue 2.0 per creare una tabella Apache Hudi su cui è possibile eseguire query con Athena, vedere Scrittura su tabelle Apache Hudi utilizzando un connettore AWS Glue personalizzato
nel Big Data Blog. AWS -
Per un articolo sull'utilizzo di Apache Hudi e Amazon Athena per creare un framework di elaborazione dati per un data lake, consulta Semplificare l'elaborazione operativa dei dati nei data lake AWS Glue utilizzando e Apache
Hudi nel Big Data Blog. AWS Glue AWS