Apache Iceberg è un formato open source ad alte prestazioni per tabelle analitiche di grandi dimensioni, che facilita l'uso di tabelle SQL per i big data e l'integrazione sicura di tali tabelle con motori come Apache Spark, Trino, Flink, Presto, Hive e Impala.
Oltre alle specifiche del formato di tabella aperta, Iceberg comprende anche una serie di API e librerie che consentono ai motori di storage, ai motori di query e ai motori di esecuzione di interagire senza problemi con le tabelle che seguono tale formato.
Il formato di tabella Iceberg è diventato parte integrante dell'ecosistema dei big data, in gran parte grazie alla sua capacità di fornire funzioni tipicamente non disponibili con altri formati di tabella. Utilizzando una serie di metadati conservati su ogni tabella, Iceberg consente l'evoluzione dello schema, l'evoluzione delle partizioni e il rollback della versione della tabella senza la necessità di costose riscritture o migrazioni delle tabelle. È completamente indipendente dal sistema di storage, con supporto per più origini dati e nessuna dipendenza dal file system.
Creato originariamente dai data engineer di Netflix e Apple nel 2017 per colmare le carenze di Apache Hive, Iceberg è stato reso open source e donato alla Apache Software Foundation l'anno successivo. È diventato un progetto Apache di alto livello nel 2020.
La velocità, l'efficienza, l'affidabilità e la facilità d'uso complessive di Apache Iceberg aiutano a semplificare e coordinare l'elaborazione dei dati su qualsiasi scala. Questi punti di forza lo hanno reso il formato di tabella preferito da una serie di importanti data warehouse, data lake e data lakehouse, tra cui IBM® watsonx.data, Netezza e Db2 warehouse.
Iceberg è uno dei pochi formati di tabella open source che consente transazioni ACID: scambi di dati che preservano l'accuratezza garantendo atomicità, coerenza, isolamento e durata.
La creazione di Iceberg è stata un'iniziativa per risolvere i limiti pratici delle tabelle Apache Hive in un ambiente di data lake di grandi dimensioni. Secondo Ryan Blue, PMC Chair del progetto Apache Iceberg ed (ex) ingegnere senior di Netflix, "molti servizi e motori diversi utilizzavano le tabelle Hive. Ma il problema era che non avevamo una garanzia di correttezza. "Non avevamo transazioni atomiche", ha affermato in una conferenza del 2021. "A volte le modifiche apportate da un sistema facevano sì che un altro sistema ricevesse i dati sbagliati e questo tipo di problema ci ha indotto a non utilizzare mai questi servizi, a non apportare modifiche alle nostre tabelle, solo per essere sicuri".1
Lo stesso Apache Hive è nato come mezzo per far funzionare i cluster Apache Hadoop in modo simile ai database relazionali accessibili da SQL. Sebbene funzioni efficacemente con i dati statici, si adatta male ai set di dati mutevoli: le modifiche devono essere coordinate manualmente tra diverse applicazioni e utenti, altrimenti si rischia il danneggiamento e la conseguente imprecisione di set di dati di grandi dimensioni.
Per garantire precisione in un ambiente dinamico, Iceberg è stato progettato per garantire che qualsiasi transazione di dati presenti tutte e quattro le proprietà ACID:
Tutte le modifiche ai dati vengono eseguite come se si trattasse di un'unica operazione: in altre parole, vengono eseguite tutte le modifiche, o nessuna. Ad esempio, in una transazione di dati finanziari, l'atomicità garantisce che a qualsiasi addebito effettuato da un conto corrisponda un accredito sull'altro conto.
Non ci sono contraddizioni tra lo stato complessivo dei dati prima della transazione e lo stato dei dati dopo la transazione. Continuando con l'esempio della transazione finanziaria, la coerenza garantisce che i fondi combinati esistenti tra i due conti siano gli stessi dopo la transazione e prima della stessa.
Lo stato intermedio di qualsiasi transazione è invisibile alle altre transazioni; le transazioni concorrenti, ovvero transazioni che operano simultaneamente sullo stesso insieme di dati, sono trattate come se fossero serializzate. In questa transazione finanziaria, l'isolamento garantisce che qualsiasi altra transazione possa vedere i fondi trasferiti nel conto addebitato o nel conto accreditato, ma non in entrambi (né in nessuno dei due).
Dopo una transazione riuscita, tutte le modifiche ai dati verranno mantenute anche in caso di guasto del sistema. Nel nostro esempio finanziario, ciò significa che la transazione rimarrà completata anche se subito dopo si verifica un'interruzione di corrente a livello di sistema.
Il formato di tabella Apache Iceberg viene spesso paragonato ad altre due tecnologie di dati open source che offrono transazioni ACID: Delta Lake, un livello di storage ottimizzato originariamente creato da Databricks che estende i file di dati Parquet con un log delle transazioni basato su file e una gestione scalabile dei metadati, e Apache Hudi, abbreviazione di "Hadoop Upserts, Deletes and Incrementals", originariamente sviluppato da Uber nel 2016.
Uno studio del 2022 condotto da Synvert ha generato dati casuali e li ha archiviati in formato JSON in un bucket AWS S3 da utilizzare per il benchmarking delle tre tecnologie. In definitiva, i loro test hanno dimostrato che il formato tabellare ottimizzato di Iceberg ha prodotto prestazioni superiori a quelle di Delta Lake e Apache Hudi in tutte le metriche testate.2
Storage: le dimensioni dei file risultanti delle tabelle Iceberg erano significativamente più piccole rispetto a quelle di Delta Lake o Hudi, il che rappresenta un grande vantaggio per l'ottimizzazione dello storage.
Operazioni di inserimento: per le operazioni di inserimento, Iceberg ha ottenuto anche le prestazioni più veloci, ovvero il tempo di esecuzione più breve. Sia Iceberg che Delta Lake erano significativamente più veloci di Hudi.
Operazioni di aggiornamento: per quanto riguarda le operazioni di aggiornamento, Iceberg si è rivelato drasticamente più veloce sia di Delta Lake che di Hudi. In particolare, a differenza delle sue controparti, il runtime di Iceberg non è aumentato in modo significativo con il numero totale di record: ai workload massimi testati nello studio (500 milioni di record), Iceberg è risultato quasi 10 volte più veloce di Delta Lake.
Operazioni di rimozione: allo stesso modo, Iceberg è stato molto più veloce di entrambe le alternative nelle operazioni di rimozione.
Iceberg implementa una gerarchia a tre strati di file di metadati per garantire la correttezza e il coordinamento dei dati delle tabelle tra diversi formati di file e modifiche costanti.
Scritto in Java e Python e offerto anche su un'API Scala, Iceberg supporta una varietà di formati di file di big data, tra cui Apache Parquet, Apache Avro e Apache ORC. Offre funzionalità simili a quelle delle tabelle SQL nei database tradizionali in modo indipendente dal formato di file e dal fornitore, consentendo a più motori di operare sullo stesso set di dati.
L'architettura di una tabella Iceberg comprende tre livelli: il catalogo Iceberg, lo strato di metadati e lo strato di dati.
Il catalogo Iceberg stesso si trova sopra lo strato di metadati e lo strato di dati, proprio come la punta di un iceberg si trova sopra la superficie dell'acqua. Memorizza i puntatori di metadati aggiornati (o "correnti") che associano il nome di una determinata tabella alla posizione dei suoi file di metadati correnti. Oltre al catalogo integrato, Iceberg supporta altri framework di catalogo come Hive MetaStore o AWS Glue.
Le operazioni a livello di catalogo Iceberg sono atomiche, in quanto ciò è essenziale per garantire la correttezza delle transazioni in corso.
Un motore di query avvia quindi qualsiasi query SELECT nel catalogo Iceberg, che fornisce la posizione del file di metadati corrente per la tabella che il motore di query tenta di leggere.
Lo strato di metadati Iceberg comprende, in ordine decrescente, file di metadati, manifest list e file manifest.
I file di metadati memorizzano i metadati di una tabella, inclusi lo schema della tabella, le informazioni sulla partizione, lo snapshot corrente e gli snapshot degli stati precedenti. Dopo essere stato indirizzato al file di metadati attuale dalla voce della tabella nel catalogo Iceberg, il motore di query utilizza il valore [ current-snapshot-id] per trovare la sua voce nell'array [snapshots]. Da lì, può individuare e aprire la manifest list della tabella.
La manifest list è semplicemente un elenco di file manifest e di informazioni importanti per ogni file di dati in essa contenuto, come la posizione, lo snapshot a cui è associato e le partizioni a cui appartiene. In questa fase sono disponibili alcune ottimizzazioni e funzioni di filtraggio.
I file manifest tengono traccia dei file di dati e dei dettagli, dei metadati e delle statistiche associati. Questo determina uno dei vantaggi fondamentali del formato di tabella Iceberg rispetto al formato di tabella Hive: la sua capacità di tenere traccia dei dati a livello di file. In questa fase, i valori [file-path] per ogni oggetto [data-file] possono essere utilizzati per trovare e aprire quel file.
Lo strato di dati, come suggerisce il nome, risiede al di sotto dello strato di metadati e contiene i file finali stessi.
Apache Iceberg offre numerose funzionalità utili per migliorare e semplificare la gestione dei dati.
Iceberg gestisce tutti i dettagli di partitioning e querying dietro le quinte. Il partizionamento nascosto di Iceberg consente agli utenti di fornire informazioni sul layout delle partizioni durante l'esecuzione di query sulle tabelle. Gli utenti non hanno bisogno di gestire personalmente le colonne di partizione, né di comprendere il layout fisico della tabella, per ottenere risultati di query accurati.
Questa operazione non solo rende il partizionamento di Iceberg molto intuitivo, ma consente anche di modificare nel tempo i layout delle partizioni senza compromettere le query predefinite. Quando le specifiche delle partizioni evolvono, i dati nella tabella (e i relativi metadati) non vengono modificati. Solo i nuovi dati, scritti nella tabella dopo l'evoluzione, vengono partizionati con la nuova specifica e i metadati per questi nuovi dati vengono conservati separatamente.
Iceberg fornisce supporto nativo per l'evoluzione degli schemi. Ciò consente agli utenti di modificare gli schemi delle tabelle senza dover effettuare una complessa migrazione dei dati, semplificando notevolmente l'adattamento alle strutture di dati in evoluzione.
Iceberg consente agli utenti di ripercorrere gli eventi passati attraverso snapshot dei dati Iceberg in diversi momenti. Questo è importante per una varietà di casi d'uso, tra cui audit, debug e controlli di conformità.
Iceberg offre una serie di funzionalità di indicizzazione che aiutano a ottimizzare le prestazioni delle query, come le opzioni di compattazione per unire i file più piccoli in quelli più grandi per ridurre il sovraccarico dei metadati e i filtri Bloom per ridurre la lettura non necessaria dei dati durante l'esecuzione delle query.
Progetta una strategia dati che elimini i silo, riduca la complessità e migliori la qualità dei dati per esperienze eccezionali di clienti e dipendenti.
Watsonx.data ti consente di scalare l'analytics e l'AI con tutti i tuoi dati, ovunque risiedano, attraverso uno storage dei dati aperto, ibrido e governato.
Sblocca il valore dei dati enterprise con IBM Consulting, creando un'organizzazione basata su insight in grado di generare vantaggi aziendali.
1 “Apache Iceberg: The Hub of an Emerging Data Service Ecosystem?”, Datanami, 8 febbraio 2021
2 “Clash of ACID Data Lakes: Comparing Data Lakehouse Formats”, synvert, a GlobalLogic company, 9 agosto 2022