Configurar el catálogo personalizado de Apache Iceberg para BigQuery para conectarse con el catálogo de entorno de ejecución de Lakehouse permite el uso de Managed Service para Apache Spark clústeres o Managed Service para Apache Spark para crear un solo, catálogo compartido.
Como parte de Lakehouse para Apache Iceberg, esta configuración te permite usar un clúster de Managed Service para Apache Spark o Managed Service para Apache Spark para crear un solo catálogo compartido.
Una vez configurada, esta capa de metadatos funciona con motores de código abierto como Apache Spark y Apache Flink para administrar tus formatos de tabla abiertos.
Antes de comenzar
- Habilita la facturación en tu Google Cloud proyecto. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.
Habilita las APIs de BigQuery y Managed Service para Apache Spark.
Comprende cómo funciona el catálogo de entorno de ejecución de Lakehouse.
Roles obligatorios
Para obtener los permisos que necesitas para configurar el catálogo de entorno de ejecución de Lakehouse, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Crea un clúster de Managed Service para Apache Spark:
Trabajador de Dataproc (
roles/dataproc.worker) en la cuenta de servicio predeterminada de Compute Engine en el proyecto. -
Crea tablas de catálogo de entorno de ejecución de Lakehouse:
- Trabajador de Dataproc (
roles/dataproc.worker) en la cuenta de servicio de VM de Managed Service para Apache Spark en el proyecto. - Editor de datos de BigQuery (
roles/bigquery.dataEditor) en la cuenta de servicio de VM de Dataproc en el proyecto. - Usuario de objetos de almacenamiento (
roles/storage.objectUser) en la cuenta de servicio de VM de Dataproc en el proyecto.
- Trabajador de Dataproc (
-
Consulta las tablas de catálogo de entorno de ejecución de Lakehouse:
- Visualizador de datos de BigQuery (
roles/bigquery.dataViewer) en el proyecto. - Usuario de BigQuery (
roles/bigquery.user) en el proyecto. - Visualizador de objetos de almacenamiento (
roles/storage.objectViewer) en el proyecto.
- Visualizador de datos de BigQuery (
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Configura el catálogo de entorno de ejecución de Lakehouse con Managed Service para Apache Spark
Puedes configurar el catálogo de entorno de ejecución de Lakehouse con Managed Service para Apache Spark con Apache Spark o Apache Flink:
Apache Spark
Configura un clúster nuevo. Para crear un clúster nuevo de Managed Service para Apache Spark, ejecuta el siguiente comando
gcloud dataproc clusters create, que contiene la configuración que necesitas para usar el catálogo de entorno de ejecución de Lakehouse:gcloud dataproc clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --region=LOCATION \ --single-node
Reemplaza lo siguiente:
CLUSTER_NAME: Un nombre para tu clúster de Managed Service para Apache Spark.PROJECT_ID: El ID del proyecto en el que creas el clúster. Google CloudLOCATION: La región de Compute Engine en la que creas el clúster.
Envía un trabajo de Apache Spark con uno de los siguientes métodos:
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"
Reemplaza lo siguiente:
PROJECT_ID: El ID del Google Cloud proyecto que contiene el clúster de Managed Service para Apache Spark.CLUSTER_NAME: El nombre del clúster de Managed Service para Apache Spark que usas para ejecutar el trabajo de Apache Spark SQL.REGION: La región de Compute Engine en la que se encuentra tu clúster.BIGLAKE_ICEBERG_CATALOG_JAR: El URI de Cloud Storage del complemento del catálogo personalizado de Apache Iceberg que se usará. Según el número de versión de Apache Iceberg, selecciona una de las siguientes opciones:- 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 ubicación de los recursos de BigQuery.CATALOG_NAME: El nombre del catálogo de Apache Spark que se usará con tu trabajo de SQL.WAREHOUSE_DIRECTORY: La carpeta de Cloud Storage que contiene tu almacén de datos. Este valor comienza congs://.SPARK_SQL_COMMAND: La consulta en SQL de Apache Spark que deseas ejecutar. Esta consulta incluye los comandos para crear tus recursos. Por ejemplo, para crear un espacio de nombres y una tabla.
CLI de spark-sql
En la Google Cloud consola de, ve a la páginaInstancias de VM.
Para conectarte a una instancia de VM de Managed Service para Apache Spark, haz clic en SSH en la fila que muestra el nombre de la instancia de VM principal del clúster de Managed Service para Apache Spark, que es el nombre del clúster seguido de un sufijo
-m. El resultado es similar a lo siguiente:Connected, host fingerprint: ssh-rsa ... Linux cluster-1-m 3.16.0-0.bpo.4-amd64 ... ... example-cluster@cluster-1-m:~$En la terminal, ejecuta el siguiente comando de inicialización para el catálogo de entorno de ejecución de 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
Reemplaza lo siguiente:
BIGLAKE_ICEBERG_CATALOG_JAR: El URI de Cloud Storage del complemento del catálogo personalizado de Apache Iceberg que se usará. Según el número de versión de Apache Iceberg, selecciona una de las siguientes opciones:- 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: El nombre del catálogo de Apache Spark que usas con tu trabajo de SQL.PROJECT_ID: El Google Cloud ID del proyecto para el catálogo de entorno de ejecución de Lakehouse con el que se vincula tu catálogo de Apache Spark.LOCATION: La Google Cloud ubicación del catálogo de entorno de ejecución de Lakehouse.WAREHOUSE_DIRECTORY: La carpeta de Cloud Storage que contiene tu almacén de datos. Este valor comienza congs://.
Después de conectarte correctamente al clúster, tu terminal de Apache Spark muestra el mensaje
spark-sql, que puedes usar para enviar trabajos de Apache Spark.spark-sql (default)>
Apache Flink
Crea un clúster de Managed Service para Apache Spark con el componente opcional de Apache Flink habilitado y asegúrate de usar Managed Service para Apache Spark
2.2o una versión posterior.En la Google Cloud consola de, ve a la página Instancias de VM.
En la lista de instancias de máquina virtual, haz clic en SSH para conectarte a la instancia de VM principal del clúster de Managed Service para Apache Spark, que aparece como el nombre del clúster seguido de un sufijo
-m.Configura el complemento del catálogo personalizado de Apache Iceberg para BigQuery para el catálogo de entorno de ejecución de 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/
Inicia la sesión de Apache Flink en 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 catálogo en 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' );
Reemplaza lo siguiente:
CATALOG_NAME: El identificador del catálogo de Apache Flink, que está vinculado al catálogo de entorno de ejecución de Lakehouse.WAREHOUSE_DIRECTORY: La ruta de acceso base para el directorio del almacén (la carpeta de Cloud Storage en la que Apache Flink crea archivos). Este valor comienza congs://.PROJECT_ID: El ID del proyecto para el catálogo de entorno de ejecución de Lakehouse con el que se vincula el catálogo de Apache Flink.LOCATION: La ubicación de los recursos de BigQuery.
Tu sesión de Apache Flink ahora está conectada al catálogo de entorno de ejecución de Lakehouse y puedes ejecutar comandos de Apache Flink SQL.
Administra los recursos del catálogo de entorno de ejecución de Lakehouse
Ahora que estás conectado al catálogo de entorno de ejecución de Lakehouse, puedes crear y ver recursos según los metadatos almacenados en el catálogo de entorno de ejecución de Lakehouse.
Por ejemplo, intenta ejecutar los siguientes comandos en tu sesión interactiva de Apache Flink SQL para crear una base de datos y una tabla de Apache Iceberg.
Usa el catálogo personalizado de Apache Iceberg para BigQuery:
USE CATALOG CATALOG_NAME;
Reemplaza
CATALOG_NAMEpor el identificador del catálogo de Apache Flink.Crea una base de datos, que crea un conjunto de datos en BigQuery:
CREATE DATABASE IF NOT EXISTS DATABASE_NAME;
Reemplaza
DATABASE_NAMEpor el nombre de tu nueva base de datos.Usa la base de datos que creaste:
USE DATABASE_NAME;
Crea una tabla de Apache Iceberg. En el siguiente ejemplo, se crea una tabla de ventas de ejemplo:
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) );
Reemplaza
ICEBERG_TABLE_NAMEpor un nombre para tu tabla nueva.Visualiza los metadatos de tablas:
DESCRIBE EXTENDED ICEBERG_TABLE_NAME;
Haz una lista de las tablas en la base de datos:
SHOW TABLES;
Transfiere datos a tu tabla
Después de crear una tabla de Apache Iceberg en la sección anterior, puedes usar Apache Flink DataGen como fuente de datos para transferir datos en tiempo real a tu tabla. Los siguientes pasos son un ejemplo de este flujo de trabajo:
Crea una tabla temporal con 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);
Reemplaza lo siguiente:
DATABASE_NAME: El nombre de la base de datos para almacenar tu tabla temporal.TEMP_TABLE_NAME: Un nombre para tu tabla temporal.ICEBERG_TABLE_NAME: El nombre de la tabla de Apache Iceberg que creaste en la sección anterior.
Establece el paralelismo en 1:
SET 'parallelism.default' = '1';
Establece el intervalo de puntos de control:
SET 'execution.checkpointing.interval' = '10second';
Establece el punto de control:
SET 'state.checkpoints.dir' = 'hdfs:///flink/checkpoints';
Inicia el trabajo de transmisión en tiempo real:
INSERT INTO ICEBERG_TABLE_NAME SELECT * FROM TEMP_TABLE_NAME;
El resultado es similar a lo siguiente:
[INFO] Submitting SQL update statement to the cluster... [INFO] SQL update statement has been successfully submitted to the cluster: Job ID: 0de23327237ad8a811d37748acd9c10b
Para verificar el estado del trabajo de transmisión, haz lo siguiente:
En la Google Cloud consola de, ve a la página Clústeres.
Selecciona tu clúster.
Haz clic en la pestaña Interfaces web.
Haz clic en el vínculo YARN ResourceManager.
En la interfaz de YARN ResourceManager , busca tu sesión de Apache Flink y haz clic en el vínculo ApplicationMaster en IU de seguimiento.
En la columna Estado, confirma que el estado de tu trabajo sea En ejecución.
Consulta los datos de transmisión en el cliente de Apache Flink SQL:
SELECT * FROM ICEBERG_TABLE_NAME /*+ OPTIONS('streaming'='true', 'monitor-interval'='3s')*/ ORDER BY order_time desc LIMIT 20;
Consulta los datos de transmisión en BigQuery:
SELECT * FROM `DATABASE_NAME.ICEBERG_TABLE_NAME` ORDER BY order_time desc LIMIT 20;
Finaliza el trabajo de transmisión en el cliente de Apache Flink SQL:
STOP JOB 'JOB_ID';
Reemplaza
JOB_IDpor el ID de trabajo que se mostró en el resultado cuando creaste el trabajo de transmisión.
Configura el catálogo de entorno de ejecución de Lakehouse con Managed Service para Apache Spark
Puedes configurar el catálogo de entorno de ejecución de Lakehouse con Managed Service para Apache Spark con Apache Spark SQL o PySpark.
SQL de Apache Spark
Crea un archivo SQL con los comandos de Apache Spark SQL que deseas ejecutar en el catálogo de entorno de ejecución de Lakehouse. Por ejemplo, este comando crea un espacio de nombres y una tabla:
CREATE NAMESPACE `CATALOG_NAME`.NAMESPACE_NAME; CREATE TABLE `CATALOG_NAME`.NAMESPACE_NAME.TABLE_NAME (id int, data string) USING ICEBERG LOCATION 'WAREHOUSE_DIRECTORY';
Reemplaza lo siguiente:
CATALOG_NAME: El nombre del catálogo que hace referencia a tu tabla de Apache Spark.NAMESPACE_NAME: El nombre del espacio de nombres que hace referencia a tu tabla de Apache Spark.TABLE_NAME: Un nombre de tabla para tu tabla de Apache Spark.WAREHOUSE_DIRECTORY: El URI de la carpeta de Cloud Storage en la que se almacena tu almacén de datos.
Para enviar un trabajo por lotes de Apache Spark SQL, ejecuta el siguiente
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"
Reemplaza lo siguiente:
SQL_SCRIPT_PATH: La ruta de acceso al archivo SQL que usa el trabajo por lotes.PROJECT_ID: El ID del Google Cloud proyecto en el que se ejecutará el trabajo por lotes.REGION: La región en la que se ejecuta tu carga de trabajo.SUBNET_NAME(opcional): El nombre de una subred de VPC en laREGIONque cumple con los requisitos de subred de la sesión.BUCKET_PATH: La ubicación del bucket de Cloud Storage para subir las dependencias de la carga de trabajo. ElWAREHOUSE_DIRECTORYse encuentra en este bucket. No se requiere el prefijo de URIgs://del bucket. Puedes especificar la ruta de acceso o el nombre del bucket, por ejemplo,mybucketname1.LOCATION: La ubicación en la que se ejecutará el trabajo por lotes.
Para obtener más información sobre cómo enviar trabajos por lotes de Apache Spark, consulta Ejecuta una carga de trabajo por lotes de Apache Spark.
PySpark
Crea un archivo de Python con los comandos de PySpark que deseas ejecutar en el catálogo de entorno de ejecución de Lakehouse.
Por ejemplo, el siguiente comando configura un entorno de Apache Spark para interactuar con las tablas de Apache Iceberg almacenadas en el catálogo de entorno de ejecución de Lakehouse. Luego, el comando crea un espacio de nombres nuevo y una tabla de Apache Iceberg dentro de ese espacio de nombres.
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';")
Reemplaza lo siguiente:
PROJECT_ID: El ID del Google Cloud proyecto en el que se ejecutará el trabajo por lotes.LOCATION: la ubicación en la que se encuentran los recursos de BigQuery.CATALOG_NAME: El nombre del catálogo que hace referencia a tu tabla de Apache Spark.TABLE_NAME: Un nombre de tabla para tu tabla de Apache Spark.WAREHOUSE_DIRECTORY: El URI de la carpeta de Cloud Storage en la que se almacena tu almacén de datos.NAMESPACE_NAME: El nombre del espacio de nombres que hace referencia a tu tabla de Apache Spark.
Envía el trabajo por lotes con el siguiente
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"
Reemplaza lo siguiente:
PYTHON_SCRIPT_PATH: La ruta de acceso a la secuencia de comandos de Python que usa el trabajo por lotes.PROJECT_ID: El ID del Google Cloud proyecto en el que se ejecutará el trabajo por lotes.REGION: La región en la que se ejecuta tu carga de trabajo.BUCKET_PATH: La ubicación del bucket de Cloud Storage para subir las dependencias de la carga de trabajo. No se requiere el prefijo de URIgs://del bucket. Puedes especificar la ruta de acceso o el nombre del bucket, por ejemplo,mybucketname1.
Para obtener más información sobre cómo enviar trabajos por lotes de PySpark, consulta la referencia de gcloud de PySpark.
¿Qué sigue?
- Crea y administra recursos.
- Configura las funciones opcionales del catálogo de entorno de ejecución de Lakehouse.