La configurazione del catalogo Apache Iceberg personalizzato per BigQuery per la connessione al catalogo runtime Lakehouse consente l'utilizzo di cluster Managed Service for Apache Spark o Managed Service for Apache Spark per creare un singolo catalogo condiviso.
Nell'ambito di Lakehouse for Apache Iceberg, questa configurazione consente di utilizzare un cluster Managed Service for Apache Spark o Managed Service for Apache Spark per creare un singolo catalogo condiviso.
Una volta configurato, questo livello di metadati funziona con motori open source come Apache Spark e Apache Flink per gestire i formati di tabella aperti.
Prima di iniziare
- Abilita la fatturazione per il tuo Google Cloud progetto. Scopri come verificare se la fatturazione è abilitata per un progetto.
Abilita le API BigQuery e Managed Service for Apache Spark.
Scopri come funziona il catalogo runtime Lakehouse.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per configurare il catalogo runtime Lakehouse, chiedi all'amministratore di concederti i seguenti ruoli IAM:
-
Crea un cluster Managed Service for Apache Spark:
Dataproc Worker (
roles/dataproc.worker) sull'account di servizio predefinito di Compute Engine nel progetto -
Crea tabelle del catalogo runtime Lakehouse:
- Dataproc Worker (
roles/dataproc.worker) sull'account di servizio della VM Managed Service for Apache Spark nel progetto - Editor dati BigQuery (
roles/bigquery.dataEditor) sull'account di servizio della VM Dataproc nel progetto - Utente oggetti Storage (
roles/storage.objectUser) sull'account di servizio della VM Dataproc nel progetto
- Dataproc Worker (
-
Esegui query sulle tabelle del catalogo runtime Lakehouse:
- Visualizzatore dati BigQuery (
roles/bigquery.dataViewer) sul progetto - Utente BigQuery (
roles/bigquery.user) sul progetto - Visualizzatore oggetti Storage (
roles/storage.objectViewer) sul progetto
- Visualizzatore dati BigQuery (
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Configura il catalogo runtime Lakehouse con Managed Service for Apache Spark
Puoi configurare il catalogo runtime Lakehouse con Managed Service for Apache Spark utilizzando Apache Spark o Apache Flink:
Apache Spark
Configura un nuovo cluster. Per creare un nuovo cluster Managed Service for Apache Spark, esegui il seguente
gcloud dataproc clusters createcomando, che contiene le impostazioni necessarie per utilizzare il catalogo runtime Lakehouse:gcloud dataproc clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --region=LOCATION \ --single-node
Sostituisci quanto segue:
CLUSTER_NAME: un nome per il cluster Managed Service for Apache Spark.PROJECT_ID: l'ID del Google Cloud progetto in cui stai creando il cluster.LOCATION: la regione Compute Engine in cui stai creando il cluster.
Invia un job Apache Spark utilizzando uno dei seguenti metodi:
Google Cloud CLI
gcloud dataproc jobs submit spark-sql \ --project=PROJECT_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --jars=https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,BIGLAKE_ICEBERG_CATALOG_JAR \ --properties=spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\ spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,\ spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,\ spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,\ spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY \ --execute="SPARK_SQL_COMMAND"
Sostituisci quanto segue:
PROJECT_ID: l'ID del Google Cloud progetto che contiene il cluster Managed Service for Apache Spark.CLUSTER_NAME: il nome del cluster Managed Service for Apache Spark che stai utilizzando per eseguire il job Apache Spark SQL.REGION: la regione Compute Engine in cui si trova il cluster.BIGLAKE_ICEBERG_CATALOG_JAR: l'URI Cloud Storage del plug-in del catalogo personalizzato Apache Iceberg da utilizzare. A seconda del numero di versione di Apache Iceberg, seleziona una delle seguenti opzioni:- Apache Iceberg 1.9.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.9.1-1.0.1.jar - Apache Iceberg 1.6.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar
- Apache Iceberg 1.9.1:
LOCATION: la località delle risorse BigQuery.CATALOG_NAME: il nome del catalogo Apache Spark da utilizzare con il job SQL.WAREHOUSE_DIRECTORY: la cartella Cloud Storage che contiene il data warehouse. Questo valore inizia congs://.SPARK_SQL_COMMAND: la query SQL Apache Spark che vuoi eseguire. Questa query include i comandi per creare le risorse. Ad esempio, per creare uno spazio dei nomi e una tabella.
Interfaccia a riga di comando spark-sql
Nella Google Cloud console, vai alla pagina Istanze VM.
Per connetterti a un'istanza VM Managed Service for Apache Spark, fai clic su SSH nella riga che elenca il nome dell'istanza VM principale del cluster Managed Service for Apache Spark, ovvero il nome del cluster seguito dal suffisso
-m. L'output è simile al seguente:Connected, host fingerprint: ssh-rsa ... Linux cluster-1-m 3.16.0-0.bpo.4-amd64 ... ... example-cluster@cluster-1-m:~$Nel terminale, esegui il seguente comando di inizializzazione per il catalogo runtime Lakehouse:
spark-sql \ --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,BIGLAKE_ICEBERG_CATALOG_JAR \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \ --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \ --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \ --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY
Sostituisci quanto segue:
BIGLAKE_ICEBERG_CATALOG_JAR: l'URI Cloud Storage del plug-in del catalogo personalizzato Apache Iceberg da utilizzare. A seconda del numero di versione di Apache Iceberg, seleziona una delle seguenti opzioni:- Apache Iceberg 1.9.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.9.1-1.0.1.jar - Apache Iceberg 1.6.1:
gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.2.jar
- Apache Iceberg 1.9.1:
CATALOG_NAME: il nome del catalogo Apache Spark che stai utilizzando con il job SQL.PROJECT_ID: l' Google Cloud ID progetto del catalogo runtime Lakehouse a cui è collegato il catalogo Apache Spark.LOCATION: la Google Cloud località del catalogo runtime Lakehouse.WAREHOUSE_DIRECTORY: la cartella Cloud Storage che contiene il data warehouse. Questo valore inizia congs://.
Dopo aver eseguito la connessione al cluster, il terminale Apache Spark visualizza il prompt
spark-sql, che puoi utilizzare per inviare i job Apache Spark.spark-sql (default)>
Apache Flink
Crea un cluster Managed Service for Apache Spark con il componente Apache Flink facoltativo abilitato e assicurati di utilizzare Managed Service for Apache Spark
2.2o versioni successive.Nella Google Cloud console, vai alla pagina Istanze VM.
Nell'elenco delle istanze della macchina virtuale, fai clic su SSH per connetterti all'istanza VM principale del cluster Managed Service for Apache Spark, elencata come nome del cluster seguito dal suffisso
-m.Configura il plug-in del catalogo Apache Iceberg personalizzato per BigQuery per il catalogo runtime Lakehouse:
FLINK_VERSION=1.19 ICEBERG_VERSION=1.6.1 cd /usr/lib/flink sudo wget -c https://repo.maven.apache.org/maven2/org/apache/iceberg/iceberg-flink-runtime-${FLINK_VERSION}/${ICEBERG_VERSION}/iceberg-flink-runtime-${FLINK_VERSION}-${ICEBERG_VERSION}.jar -P lib sudo gcloud storage cp gs://spark-lib/bigquery/iceberg-bigquery-catalog-${ICEBERG_VERSION}-1.0.2.jar lib/
Avvia la sessione Apache Flink su YARN:
HADOOP_CLASSPATH=`hadoop classpath` sudo bin/yarn-session.sh -nm flink-dataproc -d sudo bin/sql-client.sh embedded \ -s yarn-session
Crea un catalogo in Apache Flink:
CREATE CATALOG CATALOG_NAME WITH ( 'type'='iceberg', 'warehouse'='WAREHOUSE_DIRECTORY', 'catalog-impl'='org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog', 'gcp_project'='PROJECT_ID', 'gcp_location'='LOCATION' );
Sostituisci quanto segue:
CATALOG_NAME: l'identificatore del catalogo Apache Flink, collegato al catalogo runtime Lakehouse.WAREHOUSE_DIRECTORY: il percorso di base della directory del warehouse (la cartella Cloud Storage in cui Apache Flink crea i file). Questo valore inizia congs://.PROJECT_ID: l'ID progetto del catalogo runtime Lakehouse a cui è collegato il catalogo Apache Flink.LOCATION: la località delle risorse BigQuery.
La sessione Apache Flink è ora connessa al catalogo runtime Lakehouse e puoi eseguire i comandi Apache Flink SQL.
Gestisci le risorse del catalogo runtime Lakehouse
Ora che hai eseguito la connessione al catalogo runtime Lakehouse, puoi creare e visualizzare le risorse in base ai metadati archiviati nel catalogo runtime Lakehouse.
Ad esempio, prova a eseguire i seguenti comandi nella sessione Apache Flink SQL interattiva per creare un database e una tabella Apache Iceberg.
Utilizza il catalogo Apache Iceberg personalizzato per BigQuery:
USE CATALOG CATALOG_NAME;
Sostituisci
CATALOG_NAMEcon l'identificatore del catalogo Apache Flink.Crea un database, che crea un set di dati in BigQuery:
CREATE DATABASE IF NOT EXISTS DATABASE_NAME;
Sostituisci
DATABASE_NAMEcon il nome del nuovo database.Utilizza il database che hai creato:
USE DATABASE_NAME;
Crea una tabella Apache Iceberg. Il seguente comando crea una tabella di vendite di esempio:
CREATE TABLE IF NOT EXISTS ICEBERG_TABLE_NAME ( order_number BIGINT, price DECIMAL(32,2), buyer ROW<first_name STRING, last_name STRING>, order_time TIMESTAMP(3) );
Sostituisci
ICEBERG_TABLE_NAMEcon un nome per la nuova tabella.Visualizza i metadati della tabella:
DESCRIBE EXTENDED ICEBERG_TABLE_NAME;
Elenca le tabelle nel database:
SHOW TABLES;
Importa i dati nella tabella
Dopo aver creato una tabella Apache Iceberg nella sezione precedente, puoi utilizzare Apache Flink DataGen come origine dati per importare i dati in tempo reale nella tabella. I seguenti passaggi sono un esempio di questo flusso di lavoro:
Crea una tabella temporanea utilizzando DataGen:
CREATE TEMPORARY TABLE DATABASE_NAME.TEMP_TABLE_NAME WITH ( 'connector' = 'datagen', 'rows-per-second' = '10', 'fields.order_number.kind' = 'sequence', 'fields.order_number.start' = '1', 'fields.order_number.end' = '1000000', 'fields.price.min' = '0', 'fields.price.max' = '10000', 'fields.buyer.first_name.length' = '10', 'fields.buyer.last_name.length' = '10' ) LIKE DATABASE_NAME.ICEBERG_TABLE_NAME (EXCLUDING ALL);
Sostituisci quanto segue:
DATABASE_NAME: il nome del database in cui archiviare la tabella temporanea.TEMP_TABLE_NAME: un nome per la tabella temporanea.ICEBERG_TABLE_NAME: il nome della tabella Apache Iceberg creata nella sezione precedente.
Imposta il parallelismo su 1:
SET 'parallelism.default' = '1';
Imposta l'intervallo di checkpoint:
SET 'execution.checkpointing.interval' = '10second';
Imposta il checkpoint:
SET 'state.checkpoints.dir' = 'hdfs:///flink/checkpoints';
Avvia il job di streaming in tempo reale:
INSERT INTO ICEBERG_TABLE_NAME SELECT * FROM TEMP_TABLE_NAME;
L'output è simile al seguente:
[INFO] Submitting SQL update statement to the cluster... [INFO] SQL update statement has been successfully submitted to the cluster: Job ID: 0de23327237ad8a811d37748acd9c10b
Per controllare lo stato del job di streaming:
Nella Google Cloud console, vai alla pagina Cluster.
Seleziona il cluster.
Fai clic sulla scheda Interfacce web.
Fai clic sul link YARN ResourceManager.
Nell'interfaccia YARN ResourceManager , trova la sessione Apache Flink e fai clic sul link ApplicationMaster in UI di monitoraggio.
Nella colonna Stato, verifica che lo stato del job sia In esecuzione.
Esegui query sui dati di streaming nel client Apache Flink SQL:
SELECT * FROM ICEBERG_TABLE_NAME /*+ OPTIONS('streaming'='true', 'monitor-interval'='3s')*/ ORDER BY order_time desc LIMIT 20;
Esegui query sui dati di streaming in BigQuery:
SELECT * FROM `DATABASE_NAME.ICEBERG_TABLE_NAME` ORDER BY order_time desc LIMIT 20;
Termina il job di streaming nel client Apache Flink SQL:
STOP JOB 'JOB_ID';
Sostituisci
JOB_IDcon l'ID job visualizzato nell'output quando hai creato il job di streaming.
Configura il catalogo runtime Lakehouse con Managed Service for Apache Spark
Puoi configurare il catalogo runtime Lakehouse con Managed Service for Apache Spark utilizzando Apache Spark SQL o PySpark.
Apache Spark SQL
Crea un file SQL con i comandi Apache Spark SQL che vuoi eseguire nel catalogo runtime Lakehouse. Ad esempio, questo comando crea uno spazio dei nomi e una tabella:
CREATE NAMESPACE `CATALOG_NAME`.NAMESPACE_NAME; CREATE TABLE `CATALOG_NAME`.NAMESPACE_NAME.TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';
Sostituisci quanto segue:
CATALOG_NAME: il nome del catalogo che fa riferimento alla tabella Apache Spark.NAMESPACE_NAME: il nome dello spazio dei nomi che fa riferimento alla tabella Apache Spark.TABLE_NAME: un nome di tabella per la tabella Apache Spark.WAREHOUSE_DIRECTORY: l'URI della cartella Cloud Storage in cui è archiviato il data warehouse.
Invia un job batch Apache Spark SQL eseguendo il seguente
gcloud dataproc batches submit spark-sqlcomando:gcloud dataproc batches submit spark-sql SQL_SCRIPT_PATH \ --project=PROJECT_ID \ --region=REGION \ --subnet=projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME \ --deps-bucket=BUCKET_PATH \ --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog, \ spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog, \ spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID, \ spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION, \ spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY"
Sostituisci quanto segue:
SQL_SCRIPT_PATH: il percorso del file SQL utilizzato dal job batch.PROJECT_ID: l'ID del Google Cloud progetto in cui eseguire il job batch.REGION: la regione in cui viene eseguito il workload.SUBNET_NAME(facoltativo): il nome di una subnet VPC nellaREGIONche soddisfa i requisiti della subnet della sessione.BUCKET_PATH: la località del bucket Cloud Storage in cui caricare le dipendenze del workload.WAREHOUSE_DIRECTORYsi trova in questo bucket. Il prefisso URIgs://del bucket non è obbligatorio. Puoi specificare il percorso del bucket o il nome del bucket, ad esempiomybucketname1.LOCATION: la località in cui eseguire il job batch.
Per saperne di più sull'invio di job batch Apache Spark, consulta Esegui un workload batch Apache Spark.
PySpark
Crea un file Python con i comandi PySpark che vuoi eseguire nel catalogo runtime Lakehouse.
Ad esempio, il seguente comando configura un ambiente Apache Spark per interagire con le tabelle Apache Iceberg archiviate nel catalogo runtime Lakehouse. Il comando crea quindi un nuovo spazio dei nomi e una tabella Apache Iceberg all'interno di questo spazio dei nomi.
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Lakehouse runtime catalog Iceberg") \ .config("spark.sql.catalog.CATALOG_NAME", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_project", "PROJECT_ID") \ .config("spark.sql.catalog.CATALOG_NAME.gcp_location", "LOCATION") \ .config("spark.sql.catalog.CATALOG_NAME.warehouse", "WAREHOUSE_DIRECTORY") \ .getOrCreate() spark.sql("USE `CATALOG_NAME`;") spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME;") spark.sql("USE NAMESPACE_NAME;") spark.sql("CREATE TABLE TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';")
Sostituisci quanto segue:
PROJECT_ID: l'ID del Google Cloud progetto in cui eseguire il job batch.LOCATION: la località in cui si trovano le risorse BigQuery.CATALOG_NAME: il nome del catalogo che fa riferimento alla tabella Apache Spark.TABLE_NAME: un nome di tabella per la tabella Apache Spark.WAREHOUSE_DIRECTORY: l'URI della cartella Cloud Storage in cui è archiviato il data warehouse.NAMESPACE_NAME: il nome dello spazio dei nomi che fa riferimento alla tabella Apache Spark.
Invia il job batch utilizzando il seguente
gcloud dataproc batches submit pysparkcomando:gcloud dataproc batches submit pyspark PYTHON_SCRIPT_PATH \ --version=2.2 \ --project=PROJECT_ID \ --region=REGION \ --deps-bucket=BUCKET_PATH \ --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_DIRECTORY"
Sostituisci quanto segue:
PYTHON_SCRIPT_PATH: il percorso dello script Python utilizzato dal job batch.PROJECT_ID: l'ID del Google Cloud progetto in cui eseguire il job batch.REGION: la regione in cui viene eseguito il workload.BUCKET_PATH: la località del bucket Cloud Storage in cui caricare le dipendenze del workload. Il prefisso URIgs://del bucket non è obbligatorio. Puoi specificare il percorso del bucket o il nome del bucket, ad esempiomybucketname1.
Per saperne di più sull'invio di job batch PySpark, consulta il riferimento gcloud PySpark.