Tabelle Apache Iceberg

Le tabelle Apache Iceberg gestite da BigQuery (in precedenza tabelle BigLake per Apache Iceberg in BigQuery) forniscono le basi per la creazione di lakehouse in formato aperto su Google Cloud. Le tabelle Iceberg gestite offrono la stessa esperienza completamente gestita delle tabelle BigQuery standard, ma archiviano i dati in bucket di archiviazione di proprietà del cliente. Le tabelle Iceberg gestite supportano il formato delle tabelle Spark open source per una migliore interoperabilità con motori di calcolo open source e di terze parti su una singola copia dei dati.

Le tabelle Iceberg gestite supportano le seguenti funzionalità:

Architettura

Le tabelle Iceberg gestite offrono la comodità della gestione delle risorse BigQuery alle tabelle che si trovano nei tuoi bucket cloud. Puoi utilizzare BigQuery e motori di calcolo open source su queste tabelle senza spostare i dati dai bucket che controlli. Devi configurare un bucket Cloud Storage prima di iniziare a utilizzare le tabelle Iceberg gestite.

Le tabelle Iceberg gestite utilizzano il catalogo Lakehouse Runtime come catalogo di runtime unificato per tutti i dati Spark. Il catalogo di runtime di Lakehouse fornisce un'unica fonte di riferimento per la gestione dei metadati di più motori e consente l'interoperabilità dei motori.

L'utilizzo delle tabelle Apache Iceberg ha le seguenti implicazioni per il tuo bucket:

  • BigQuery crea nuovi file di dati nel bucket in risposta a richieste di scrittura e ottimizzazioni dell'archiviazione in background, ad esempio istruzioni DML e streaming.
  • La compattazione e il clustering automatici vengono eseguiti sui file di dati nel bucket. Dopo la scadenza della finestra di spostamento nel tempo, i file di dati vengono raccolti come spazzatura. Tuttavia, se la tabella viene eliminata, i file di dati associati non vengono sottoposti a garbage collection. Per saperne di più, vedi Ottimizzazione dello spazio di archiviazione.

La creazione di una tabella Spark è simile alla creazione di tabelle BigQuery. Poiché archivia i dati in formati aperti su Cloud Storage, devi:

  • Specifica la connessione alla risorsa Cloud con WITH CONNECTION per configurare le credenziali di connessione per BigQuery per accedere a Cloud Storage.
  • Specifica il formato file dell'archiviazione dei dati come PARQUET con l'istruzione file_format = PARQUET.
  • Specifica il formato della tabella dei metadati open source come ICEBERG con l'istruzione table_format = ICEBERG.

Best practice

La modifica o l'aggiunta diretta di file al bucket al di fuori di BigQuery può comportare la perdita di dati o errori non recuperabili. La tabella seguente descrive i possibili scenari:

Operazione Conseguenze Prevenzione
Aggiungi nuovi file al bucket al di fuori di BigQuery. Perdita di dati:i nuovi file o oggetti aggiunti al di fuori di BigQuery non vengono monitorati da BigQuery. I file non monitorati vengono eliminati dai processi di garbage collection in background. Aggiungi dati esclusivamente tramite BigQuery. In questo modo BigQuery può tenere traccia dei file ed evitare che vengano sottoposti a garbage collection.
Per evitare aggiunte accidentali e perdita di dati, ti consigliamo anche di limitare le autorizzazioni di scrittura degli strumenti esterni sui bucket contenenti tabelle Iceberg gestite.
Crea una nuova tabella Spark in un prefisso non vuoto. Perdita di dati:i dati esistenti non vengono monitorati da BigQuery, quindi questi file vengono considerati non monitorati ed eliminati dai processi di Garbage Collection in background. Crea solo nuove tabelle Iceberg gestite in prefissi vuoti.
Modifica o sostituisci i file di dati della tabella Spark. Perdita di dati:in caso di modifica o sostituzione esterna, la tabella non supera un controllo di coerenza e diventa illeggibile. Le query sulla tabella non riescono.
Non esiste un modo self-service per eseguire il recupero da questo punto. Contatta l'assistenza per ricevere aiuto con il recupero dei dati.
Modifica i dati esclusivamente tramite BigQuery. In questo modo BigQuery può tenere traccia dei file ed evitare che vengano sottoposti a garbage collection.
Per evitare aggiunte accidentali e perdita di dati, ti consigliamo anche di limitare le autorizzazioni di scrittura degli strumenti esterni sui bucket contenenti tabelle Iceberg gestite.
Crea due tabelle Iceberg gestite sugli stessi URI o su URI sovrapposti. Perdita di dati:BigQuery non collega istanze URI identiche di tabelle Managed Iceberg. I processi di garbage collection in background per ogni tabella considereranno i file della tabella opposta come non monitorati ed elimineranno, causando la perdita di dati. Utilizza URI univoci per ogni tabella Spark.

Best practice per la configurazione dei bucket Cloud Storage

La configurazione del bucket Cloud Storage e la sua connessione a BigQuery influiscono direttamente su prestazioni, costi, integrità, sicurezza e governance delle tabelle Iceberg gestite. Di seguito sono riportate le best practice per facilitare questa configurazione:

  • Seleziona un nome che indichi chiaramente che il bucket è destinato solo alle tabelle Iceberg gestite.

  • Scegli bucket Cloud Storage monoregionali che si trovano nella stessa regione del tuo dataset BigQuery. Questo coordinamento migliora le prestazioni e riduce i costi evitando le tariffe per il trasferimento di dati.

  • Per impostazione predefinita, Cloud Storage archivia i dati nella classe di archiviazione Standard, che offre prestazioni sufficienti. Per ottimizzare i costi di archiviazione dei dati, puoi abilitare Autoclass per gestire automaticamente le transizioni delle classi di archiviazione. Autoclass inizia con la classe di archiviazione Standard Storage e sposta gli oggetti a cui non si accede in classi progressivamente meno frequenti per ridurre i costi di archiviazione. Quando l'oggetto viene letto di nuovo, viene spostato di nuovo nella classe Standard.

  • Attiva l'accesso uniforme a livello di bucket e la prevenzione dell'accesso pubblico.

  • Verifica che i ruoli richiesti siano assegnati agli utenti e ai service account corretti.

  • Per evitare l'eliminazione o il danneggiamento accidentale dei dati Spark nel bucket Cloud Storage, limita le autorizzazioni di scrittura ed eliminazione per la maggior parte degli utenti della tua organizzazione. Puoi farlo impostando un criterio di autorizzazione del bucket con condizioni che negano le richieste PUT e DELETE per tutti gli utenti, tranne quelli che specifichi.

  • Applica chiavi di crittografia gestite da Google o gestite dal cliente per una maggiore protezione dei dati sensibili.

  • Abilita l'audit logging per la trasparenza operativa, la risoluzione dei problemi e il monitoraggio dell'accesso ai dati.

  • Mantieni il criterio di eliminazione temporanea predefinito (conservazione di 7 giorni) per proteggerti da eliminazioni accidentali. Tuttavia, se noti che i dati Spark sono stati eliminati, contatta l'assistenza anziché ripristinare gli oggetti manualmente, poiché gli oggetti aggiunti o modificati al di fuori di BigQuery non vengono monitorati dai metadati BigQuery.

  • Il dimensionamento adattivo dei file, il clustering automatico e la garbage collection sono abilitati automaticamente e contribuiscono a ottimizzare le prestazioni e i costi dei file.

  • Evita le seguenti funzionalità di Cloud Storage, in quanto non sono supportate per le tabelle Iceberg gestite:

Puoi implementare queste best practice creando il bucket con il seguente comando:

gcloud storage buckets create gs://BUCKET_NAME \
    --project=PROJECT_ID \
    --location=LOCATION \
    --enable-autoclass \
    --public-access-prevention \
    --uniform-bucket-level-access

Sostituisci quanto segue:

  • BUCKET_NAME: il nome del nuovo bucket
  • PROJECT_ID: l'ID del progetto
  • LOCATION: la posizione del nuovo bucket

Workflow delle tabelle Spark

Le sezioni seguenti descrivono come creare, caricare, gestire ed eseguire query sulle tabelle gestite.

Prima di iniziare

Prima di creare e utilizzare le tabelle Iceberg gestite, assicurati di aver configurato una connessione alle risorse Cloud a un bucket di archiviazione. La connessione deve disporre delle autorizzazioni di scrittura sul bucket di archiviazione, come specificato nella seguente sezione Ruoli richiesti. Per ulteriori informazioni sui ruoli e sulle autorizzazioni richiesti per le connessioni, consulta Gestisci le connessioni.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per consentire a BigQuery di gestire le tabelle nel tuo progetto, chiedi all'amministratore di concederti i seguenti ruoli IAM:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questi ruoli predefiniti contengono le autorizzazioni necessarie per consentire a BigQuery di gestire le tabelle nel tuo progetto. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per consentire a BigQuery di gestire le tabelle nel tuo progetto, sono necessarie le seguenti autorizzazioni:

  • Tutte:
    • bigquery.connections.delegate sul tuo progetto
    • bigquery.jobs.create sul tuo progetto
    • bigquery.readsessions.create sul tuo progetto
    • bigquery.tables.create sul tuo progetto
    • bigquery.tables.get sul tuo progetto
    • bigquery.tables.getData sul tuo progetto
    • storage.buckets.get sul tuo bucket
    • storage.objects.create sul tuo bucket
    • storage.objects.delete sul tuo bucket
    • storage.objects.get sul tuo bucket
    • storage.objects.list sul tuo bucket

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Creare tabelle Iceberg gestite

Per creare una tabella Spark, seleziona uno dei seguenti metodi:

SQL

CREATE TABLE [PROJECT_ID.]DATASET_ID.TABLE_NAME (
COLUMN DATA_TYPE[, ...]
)
CLUSTER BY CLUSTER_COLUMN_LIST
WITH CONNECTION {CONNECTION_NAME | DEFAULT}
OPTIONS (
file_format = 'PARQUET',
table_format = 'ICEBERG',
storage_uri = 'STORAGE_URI');

Sostituisci quanto segue:

  • PROJECT_ID: il progetto contenente il set di dati. Se non è definito, il comando presuppone il progetto predefinito.
  • DATASET_ID: un set di dati esistente.
  • TABLE_NAME: il nome della tabella che stai creando.
  • DATA_TYPE: il tipo di dati delle informazioni contenute nella colonna.
  • CLUSTER_COLUMN_LIST (facoltativo): un elenco separato da virgole contenente fino a quattro colonne. Devono essere colonne di primo livello non ripetute.
  • CONNECTION_NAME: il nome della connessione. Ad esempio, myproject.us.myconnection.

Per utilizzare una connessione predefinita, specifica DEFAULT anziché la stringa di connessione contenente PROJECT_ID.REGION.CONNECTION_ID.

bq

bq --project_id=PROJECT_ID mk \
    --table \
    --file_format=PARQUET \
    --table_format=ICEBERG \
    --connection_id=CONNECTION_NAME \
    --storage_uri=STORAGE_URI \
    --schema=COLUMN_NAME:DATA_TYPE[, ...] \
    --clustering_fields=CLUSTER_COLUMN_LIST \
    DATASET_ID.MANAGED_TABLE_NAME

Sostituisci quanto segue:

  • PROJECT_ID: il progetto contenente il set di dati. Se non è definito, il comando presuppone il progetto predefinito.
  • CONNECTION_NAME: il nome della connessione. Ad esempio, myproject.us.myconnection.
  • STORAGE_URI: un URI di Cloud Storage completo. Ad esempio gs://mybucket/table.
  • COLUMN_NAME: il nome della colonna.
  • DATA_TYPE: il tipo di dati delle informazioni contenute nella colonna.
  • CLUSTER_COLUMN_LIST (facoltativo): un elenco separato da virgole contenente fino a quattro colonne. Devono essere colonne di primo livello non ripetute.
  • DATASET_ID: l'ID di un set di dati esistente.
  • MANAGED_TABLE_NAME: il nome della tabella che stai creando.

API

Chiama il metodo tables.insert con una risorsa tabella definita, simile alla seguente:

{
"tableReference": {
  "tableId": "TABLE_NAME"
},
"biglakeConfiguration": {
  "connectionId": "CONNECTION_NAME",
  "fileFormat": "PARQUET",
  "tableFormat": "ICEBERG",
  "storageUri": "STORAGE_URI"
},
"schema": {
  "fields": [
    {
      "name": "COLUMN_NAME",
      "type": "DATA_TYPE"
    }
    [, ...]
  ]
}
}

Sostituisci quanto segue:

  • TABLE_NAME: il nome della tabella che stai creando.
  • CONNECTION_NAME: il nome della connessione. Ad esempio, myproject.us.myconnection.
  • STORAGE_URI: un URI di Cloud Storage completo. Sono supportati anche i caratteri jolly. Ad esempio: gs://mybucket/table.
  • COLUMN_NAME: il nome della colonna.
  • DATA_TYPE: il tipo di dati delle informazioni contenute nella colonna.

Importare dati nelle tabelle Iceberg gestite

Le sezioni seguenti descrivono come importare i dati da vari formati di tabella nelle tabelle Iceberg gestite.

Carica i dati standard dai flat file

Le tabelle Iceberg gestite utilizzano i job di caricamento BigQuery per caricare file esterni nelle tabelle Iceberg gestite. Se hai una tabella Spark esistente, segui la guida alla CLI bq load o la guida a SQL LOAD per caricare dati esterni. Dopo il caricamento dei dati, vengono scritti nuovi file Parquet nella cartella STORAGE_URI/data.

Se le istruzioni precedenti vengono utilizzate senza una tabella Spark esistente, viene creata una tabella BigQuery.

Per esempi specifici dello strumento di caricamenti batch nelle tabelle gestite, consulta quanto segue:

SQL

LOAD DATA INTO MANAGED_TABLE_NAME
FROM FILES (
uris=['STORAGE_URI'],
format='FILE_FORMAT');

Sostituisci quanto segue:

  • MANAGED_TABLE_NAME: il nome di una tabella Spark esistente.
  • STORAGE_URI: un URI Cloud Storage completo o un elenco separato da virgole di URI. Sono supportati anche i caratteri jolly. Ad esempio: gs://mybucket/table.
  • FILE_FORMAT: il formato della tabella di origine. Per i formati supportati, vedi la riga format di load_option_list.

bq

bq load \
  --source_format=FILE_FORMAT \
  MANAGED_TABLE \
  STORAGE_URI

Sostituisci quanto segue:

  • FILE_FORMAT: il formato della tabella di origine. Per i formati supportati, vedi la riga format di load_option_list.
    • MANAGED_TABLE_NAME: il nome di una tabella Apache Iceberg esistente.
  • STORAGE_URI: un URI Cloud Storage completo o un elenco separato da virgole di URI. Sono supportati anche i caratteri jolly. Ad esempio: gs://mybucket/table.

Caricamento standard da file partizionati Apache Hive

Puoi caricare i file partizionati Apache Hive nelle tabelle Managed Iceberg utilizzando i job di caricamento BigQuery standard. Per saperne di più, consulta Caricamento di dati partizionati esternamente.

Carica i dati di streaming da Pub/Sub

Puoi caricare i dati di streaming nelle tabelle Iceberg gestite utilizzando una sottoscrizione Pub/Sub BigQuery.

Esportare dati dalle tabelle Iceberg gestite

Le seguenti sezioni descrivono come esportare i dati dalle tabelle Iceberg gestite in vari formati di tabella.

Esportare i dati in formati piatti

Per esportare una tabella Spark in un formato piatto, utilizza l'istruzione EXPORT DATA e seleziona un formato di destinazione. Per saperne di più, consulta Esportazione di dati.

Crea snapshot dei metadati delle tabelle Spark

Per creare uno snapshot dei metadati della tabella Spark:

  1. Esporta i metadati nel formato Spark V2 con l'istruzione SQL EXPORT TABLE METADATA.

  2. (Facoltativo) Pianifica l'aggiornamento dello snapshot dei metadati di Spark. Per aggiornare uno snapshot dei metadati Spark in base a un intervallo di tempo impostato, utilizza una query pianificata.

  3. (Facoltativo) Attiva l'aggiornamento automatico dei metadati per il tuo progetto per aggiornare automaticamente lo snapshot dei metadati della tabella Spark a ogni modifica della tabella. Per attivare l'aggiornamento automatico dei metadati, contatta bigquery-tables-for-apache-iceberg-help@google.com. I costi di EXPORT METADATA vengono applicati a ogni operazione di aggiornamento.

L'esempio seguente crea una query pianificata denominata My Scheduled Snapshot Refresh Query utilizzando l'istruzione DDL EXPORT TABLE METADATA FROM mydataset.test. L'istruzione DDL viene eseguita ogni 24 ore.

bq query \
    --use_legacy_sql=false \
    --display_name='My Scheduled Snapshot Refresh Query' \
    --schedule='every 24 hours' \
    'EXPORT TABLE METADATA FROM mydataset.test'

Visualizzare lo snapshot dei metadati della tabella Spark

Dopo aver aggiornato lo snapshot dei metadati della tabella Spark, puoi trovarlo nell'URI Cloud Storage in cui è stata creata originariamente la tabella Spark. La cartella /data contiene gli shard di dati dei file Parquet, mentre la cartella /metadata contiene lo snapshot dei metadati della tabella Spark.

SELECT
  table_name,
  REGEXP_EXTRACT(ddl, r"storage_uri\s*=\s*\"([^\"]+)\"") AS storage_uri
FROM
  `mydataset`.INFORMATION_SCHEMA.TABLES;

Tieni presente che mydataset e table_name sono segnaposto per il set di dati e la tabella effettivi.

Leggere le tabelle Iceberg gestite con Spark

Il seguente esempio configura l'ambiente per utilizzare Spark SQL con Spark, quindi esegue una query per recuperare i dati da una tabella Spark specificata.

spark-sql \
  --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \
  --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
  --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \
  --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \

# Query the table
SELECT * FROM CATALOG_NAME.FOLDER_NAME;

Sostituisci quanto segue:

  • ICEBERG_VERSION_NUMBER: la versione attuale del runtime Spark. Scarica l'ultima versione da Spark Releases.
  • CATALOG_NAME: il catalogo a cui fare riferimento per la tabella Spark.
  • BUCKET_PATH: il percorso del bucket contenente i file della tabella. Ad esempio, gs://mybucket/.
  • FOLDER_NAME: la cartella contenente i file della tabella. Ad esempio, myfolder.

Modificare le tabelle Iceberg gestite

Per modificare una tabella Spark, segui i passaggi descritti in Modifica degli schemi delle tabelle.

Utilizzare le transazioni con più istruzioni

Per ottenere l'accesso alle transazioni con più istruzioni per le tabelle Iceberg gestite, compila il modulo di registrazione.

Utilizzare il partizionamento

Per accedere al partizionamento per le tabelle Apache Iceberg, compila il modulo di registrazione.

Per partizionare una tabella, specifica una colonna di partizione, che viene utilizzata per segmentare la tabella. Per le tabelle Iceberg gestite sono supportati i seguenti tipi di colonne:

  • DATE
  • DATETIME
  • TIMESTAMP

Il partizionamento di una tabella in base a una colonna DATE, DATETIME o TIMESTAMP è noto come partizionamento in base a una colonna unità di tempo. Scegli se le partizioni devono avere una granularità oraria, giornaliera, mensile o annuale.

Le tabelle Iceberg gestite supportano anche il clustering e la combinazione di tabelle in cluster e partizionate.

Limitazioni del partizionamento

Crea una tabella Spark partizionata

Per creare una tabella Spark partizionata, segui le istruzioni per creare una tabella Spark standard e includi uno dei seguenti elementi, a seconda del tuo ambiente:

Modificare ed eseguire query sulle tabelle Managed Iceberg partizionate

Le istruzioni e le query del Data Manipulation Language (DML) di BigQuery per le tabelle Managed Iceberg partizionate sono le stesse delle tabelle Spark standard. BigQuery limita automaticamente l'ambito del job alle partizioni corrette, in modo simile al partizionamento nascosto di Spark. Inoltre, tutti i nuovi dati che aggiungi alla tabella vengono partizionati automaticamente.

Puoi anche eseguire query sulle tabelle Managed Iceberg partizionate con altri motori nello stesso modo delle tabelle Managed Iceberg standard. Per un'esperienza ottimale, ti consigliamo di attivare gli snapshot dei metadati.

Per una maggiore sicurezza, le informazioni sul partizionamento per le tabelle Iceberg gestite sono separate dal percorso dei dati e vengono gestite interamente dal livello dei metadati.

Prezzi

I prezzi delle tabelle Spark sono costituiti da archiviazione, ottimizzazione dell'archiviazione, query e job.

Archiviazione

Le tabelle Iceberg gestite archiviano tutti i dati in Cloud Storage. Ti vengono addebitati tutti i dati archiviati, inclusi i dati storici delle tabelle. Potrebbero essere applicati anche costi di elaborazione e trasferimento dei dati di Cloud Storage. Alcune tariffe per le operazioni di Cloud Storage potrebbero essere esentate per le operazioni elaborate tramite BigQuery o l'API BigQuery Storage. Non sono previste tariffe di archiviazione specifiche per BigQuery. Per maggiori informazioni, consulta la pagina Prezzi di Cloud Storage.

Ottimizzazione archiviazione

Le tabelle Iceberg gestite eseguono la gestione automatica delle tabelle, inclusi compattazione, clustering, garbage collection e generazione/aggiornamento dei metadati BigQuery per ottimizzare le prestazioni delle query e ridurre i costi di archiviazione. L'utilizzo delle risorse di calcolo per la gestione delle tabelle viene fatturato in unità di calcolo dei dati (DCU) nel tempo, con incrementi al secondo. Per ulteriori dettagli, consulta la sezione Prezzi delle tabelle Apache Iceberg.

Le operazioni di esportazione dei dati eseguite durante lo streaming tramite l'API Storage Write sono incluse nei prezzi dell'API Storage Write e non vengono addebitate come manutenzione in background. Per saperne di più, consulta Prezzi dell'importazione dati.

Per visualizzare i log e l'utilizzo di Compute per queste operazioni in background, esegui una query sulla visualizzazione INFORMATION_SCHEMA.JOBS. Per query di esempio, vedi quanto segue:

Query e job

Analogamente alle tabelle BigQuery, ti vengono addebitati i costi per le query e i byte letti (per TiB) se utilizzi i prezzi on demand di BigQuery o il consumo di slot (per ora di slot) se utilizzi i prezzi di computing con capacità BigQuery.

I prezzi di BigQuery si applicano anche all'API BigQuery Storage Read e all'API Storage Write.

Le operazioni di caricamento ed esportazione (ad esempio EXPORT METADATA) utilizzano slot pay as you go di Enterprise edition. Questo è diverso dalle tabelle BigQuery, per le quali queste operazioni non comportano costi. Se sono disponibili prenotazioni PIPELINE con slot Enterprise o Enterprise Plus, le operazioni di caricamento ed esportazione utilizzano preferibilmente questi slot di prenotazione.

Limitazioni

Le tabelle Iceberg gestite presentano le seguenti limitazioni: