En este documento, se muestra cómo crear una tabla de Apache Iceberg con metadatos en BigQuery Metastore con el servicio de trabajos de Dataproc, la CLI de Spark SQL o la interfaz web de Zeppelin que se ejecuta en un clúster de Dataproc.
Antes de comenzar
Si aún no lo hiciste, crea un proyecto de Google Cloud , un bucket de Cloud Storage y un clúster de Dataproc.
Configura tu proyecto
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataproc, BigQuery, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataproc, BigQuery, and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
Crea un bucket de Cloud Storage en tu proyecto.
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
-
For Choose where to store your data, do the following:
- Select a Location type option.
- Select a Location option.
- For Choose a default storage class for your data, select a storage class.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
Crea un clúster de Dataproc. Para ahorrar recursos y costos, puedes crear un clúster de Dataproc de un solo nodo para ejecutar los ejemplos que se presentan en este documento.
La subred de la región en la que se crea el clúster debe tener habilitado el Acceso privado a Google (PGA).
Si deseas ejecutar el ejemplo de la interfaz web de Zeppelin en esta guía, debes usar o crear un clúster de Dataproc con el componente opcional de Zeppelin habilitado.
Otorga roles a una cuenta de servicio personalizada (si es necesario): De forma predeterminada, las VMs del clúster de Dataproc usan la cuenta de servicio predeterminada de Compute Engine para interactuar con Dataproc. Si deseas especificar una cuenta de servicio personalizada cuando creas tu clúster, esta debe tener el rol de Trabajador de Dataproc (
roles/dataproc.worker
) o un rol personalizado con los permisos de rol de trabajador necesarios.
Asignación de bases de datos de OSS a conjuntos de datos de BigQuery
Ten en cuenta la siguiente asignación entre los términos de base de datos de código abierto y los conjuntos de datos de BigQuery:
Base de datos de OSS | Conjunto de datos de BigQuery |
---|---|
Espacio de nombres, base de datos | Conjunto de datos |
Tabla particionada o no particionada | Tabla |
Ver | Ver |
Crea una tabla de Iceberg
En esta sección, se muestra cómo crear una tabla de Iceberg con metadatos en BigQuery Metastore. Para ello, envía un código de Spark SQL al servicio de Dataproc, la CLI de Spark SQL y la interfaz web del componente Zeppelin, que se ejecutan en un clúster de Dataproc.
Trabajo de Dataproc
Puedes enviar un trabajo al servicio de Dataproc enviando el trabajo a un clúster de Dataproc con la consola de Google Cloud o la CLI de Google Cloud, o a través de una solicitud REST HTTP o una llamada programática de gRPC de Dataproc a las bibliotecas cliente de Cloud a la API de Dataproc Jobs.
En los ejemplos de esta sección, se muestra cómo enviar un trabajo de SQL de Spark de Dataproc al servicio de Dataproc para crear una tabla Iceberg con metadatos en BigQuery con gcloud CLI, la consola de Google Cloud o la API de REST de Dataproc.
Prepara archivos de trabajo
Sigue los pasos que se describen a continuación para crear un archivo de trabajo de Spark SQL. El archivo contiene comandos de Spark SQL para crear y actualizar una tabla de Iceberg.
En una ventana de terminal local o en Cloud Shell, usa un editor de texto, como
vi
onano
, para copiar los siguientes comandos en un archivoiceberg-table.sql
y, luego, guárdalo en el directorio actual.USE CATALOG_NAME; CREATE NAMESPACE IF NOT EXISTS example_namespace; USE example_namespace; DROP TABLE IF EXISTS example_table; CREATE TABLE example_table (id int, data string) USING ICEBERG LOCATION 'gs://BUCKET/WAREHOUSE_FOLDER'; INSERT INTO example_table VALUES (1, 'first row'); ALTER TABLE example_table ADD COLUMNS (newDoubleCol double); DESCRIBE TABLE example_table;
Reemplaza lo siguiente:
- CATALOG_NAME: Es el nombre del catálogo de Iceberg.
- BUCKET y WAREHOUSE_FOLDER: Son el bucket y la carpeta de Cloud Storage que se usan para el almacén de Iceberg.
Usa la herramienta
gsutil
para copiar eliceberg-table.sql
local a tu bucket de Cloud Storage.gsutil cp iceberg-table.sql gs://BUCKET/
A continuación, descarga y copia el archivo JAR iceberg-spark-runtime-3.5_2.12-1.5.2
en
Cloud Storage.
En una ventana de la terminal local o en Cloud Shell, ejecuta el siguiente comando
curl
para descargar el archivo JARiceberg-spark-runtime-3.5_2.12-1.5.2
al directorio actual.curl -o iceberg-spark-runtime-3.5_2.12-1.5.2.jar https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar
Usa la herramienta
gsutil
para copiar el archivo JARiceberg-spark-runtime-3.5_2.12-1.5.2
local del directorio actual a tu bucket de Cloud Storage.gsutil cp iceberg-spark-runtime-3.5_2.12-1.5.2.jar gs://BUCKET/
Envía el trabajo de Spark SQL
Selecciona una pestaña para seguir las instrucciones para enviar el trabajo de Spark SQL al servicio de Dataproc con gcloud CLI, la consola de Google Cloud o la API de REST de Dataproc.
gcloud
Ejecuta el siguiente comando gcloud dataproc jobs submit spark-sql de forma local en una ventana de terminal local o en Cloud Shell para enviar el trabajo de Spark SQL y crear la tabla Iceberg.
gcloud dataproc jobs submit spark-sql \ --project=PROJECT_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --jars="gs://BUCKET/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.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=gs://BUCKET/WAREHOUSE_FOLDER" \ -f="gs://BUCKETiceberg-table.sql"
Notas:
- PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de proyecto se enumeran en la sección Información del proyecto en el panel de la consola de Google Cloud.
- CLUSTER_NAME: Es el nombre de tu clúster de Dataproc.
- REGION: La región de Compute Engine en la que se encuentra tu clúster.
- CATALOG_NAME: Es el nombre del catálogo de Iceberg.
- BUCKET y WAREHOUSE_FOLDER: Son el bucket y la carpeta de Cloud Storage que se usan para el almacén de Iceberg.
- LOCATION: Una ubicación de BigQuery compatible. La ubicación predeterminada es "US".
--jars
: Los archivos JAR enumerados son necesarios para crear metadatos de tablas en BigQuery Metastore.--properties
: Propiedades del catálogo.-f
: Es el archivo de trabajoiceberg-table.sql
que copiaste en tu bucket de Cloud Storage.
Consulta la descripción de la tabla en el resultado de la terminal cuando finalice el trabajo.
Time taken: 2.194 seconds id int data string newDoubleCol double Time taken: 1.479 seconds, Fetched 3 row(s) Job JOB_ID finished successfully.
Para ver los metadatos de la tabla en BigQuery
En la consola de Google Cloud, ve a la página de BigQuery.
Visualiza los metadatos de la tabla de Iceberg.
Console
Sigue estos pasos para usar la consola de Google Cloud y enviar el trabajo de Spark SQL al servicio de Dataproc para crear una tabla Iceberg con metadatos en BigQuery Metastore.
En la consola de Google Cloud, ve a Enviar un trabajo de Dataproc.
Ve a la página Enviar un trabajo y, luego, completa los siguientes campos:
- ID de trabajo: Acepta el ID sugerido o inserta el tuyo.
- Región: Selecciona la región en la que se encuentra tu clúster.
- Clúster: Selecciona tu clúster.
- Tipo de trabajo: Selecciona
SparkSql
. - Tipo de fuente de consulta: Selecciona
Query file
. - Archivo de consulta: Inserta
gs://BUCKET/iceberg-table.sql
. - Archivos JAR: Inserta lo siguiente:
gs://BUCKET/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar
- Propiedades: Haz clic en
key
value
y, luego, copia los siguientes pares Clave y Valor para definir cinco propiedades.# Clave Valor 1. spark.sql.catalog.CATALOG_NAME
org.apache.iceberg.spark.SparkCatalog
2. spark.sql.catalog.CATALOG_NAME.catalog-impl
org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog
3. spark.sql.catalog.CATALOG_NAME.gcp_project
PROJECT_ID
4. spark.sql.catalog.CATALOG_NAME.gcp_location
LOCATION
5. spark.sql.catalog.CATALOG_NAME.warehouse
gs://BUCKET/WAREHOUSE_FOLDER
Agregar propiedad
cinco veces para crear una lista de cinco campos de entrada
Notas:
- CATALOG_NAME: Es el nombre del catálogo de Iceberg.
- PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de los proyectos se enumeran en la sección Información del proyecto en el panel de la consola de Google Cloud. región en la que se encuentra tu clúster.
- LOCATION: Una ubicación de BigQuery compatible. La ubicación predeterminada es "US".
- BUCKET y WAREHOUSE_FOLDER: Son el bucket y la carpeta de Cloud Storage que se usan para el almacén de Iceberg.
Haz clic en Enviar.
Para supervisar el progreso del trabajo y ver su resultado, ve a la página Trabajos de Dataproc en la consola de Google Cloud y haz clic en
Job ID
para abrir la página Detalles del trabajo.Para ver los metadatos de la tabla en BigQuery
En la consola de Google Cloud, ve a la página de BigQuery.
Visualiza los metadatos de la tabla de Iceberg.
REST
Puedes usar la API de jobs.submit de Dataproc para enviar el trabajo de Spark SQL al servicio de Dataproc y crear una tabla de Iceberg con metadatos en BigQuery Metastore.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
- PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de los proyectos se enumeran en la sección Información del proyecto en el panel de la consola de Google Cloud.
- CLUSTER_NAME: Es el nombre de tu clúster de Dataproc.
- REGION: La región de Compute Engine en la que se encuentra tu clúster.
- CATALOG_NAME: Es el nombre del catálogo de Iceberg.
- BUCKET y WAREHOUSE_FOLDER: Son el bucket y la carpeta de Cloud Storage que se usan para el almacén de Iceberg. LOCATION: Una ubicación de BigQuery compatible. La ubicación predeterminada es "US".
jarFileUris
: Los archivos JAR enumerados son necesarios para crear metadatos de tablas en BigQuery Metastore.properties
: Propiedades del catálogo.queryFileUri
: Es el archivo de trabajoiceberg-table.sql
que copiaste en tu bucket de Cloud Storage.
Método HTTP y URL:
POST https://dataproc.googleapis.com/v1/projects/PROJECT_ID/regions/REGION/jobs:submit
Cuerpo JSON de la solicitud:
{ "projectId": "PROJECT_ID", "job": { "placement": { "clusterName": "CLUSTER_NAME" }, "statusHistory": [], "reference": { "jobId": "", "projectId": "PROJECT_ID" }, "sparkSqlJob": { "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": "gs://BUCKET/WAREHOUSE_FOLDER" }, "jarFileUris": [ "gs://BUCKET/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar" ], "scriptVariables": {}, "queryFileUri": "gs://BUCKET/iceberg-table.sql" } } }
Para enviar tu solicitud, expande una de estas opciones:
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
{ "reference": { "projectId": "PROJECT_ID", "jobId": "..." }, "placement": { "clusterName": "CLUSTER_NAME", "clusterUuid": "..." }, "status": { "state": "PENDING", "stateStartTime": "..." }, "submittedBy": "USER", "sparkSqlJob": { "queryFileUri": "gs://BUCKET/iceberg-table.sql", "properties": { "spark.sql.catalog.USER_catalog": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.USER_catalog.catalog-impl": "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog", "spark.sql.catalog.USER_catalog.gcp_project": "PROJECT_ID", "spark.sql.catalog.USER_catalog.gcp_location": "LOCATION", "spark.sql.catalog.USER_catalog.warehouse": "gs://BUCKET/WAREHOUSE_FOLDER" }, "jarFileUris": [ "gs://BUCKET/iceberg-spark-runtime-3.5_2.12-1.5.2.jar", "gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar" ] }, "driverControlFilesUri": "gs://dataproc-...", "driverOutputResourceUri": "gs://dataproc-.../driveroutput", "jobUuid": "...", "region": "REGION" }
Para supervisar el progreso del trabajo y ver su resultado, ve a la página Trabajos de Dataproc en la consola de Google Cloud y haz clic en Job ID
para abrir la página Detalles del trabajo.
Para ver los metadatos de la tabla en BigQuery
En la consola de Google Cloud, ve a la página de BigQuery.
Visualiza los metadatos de la tabla de Iceberg.
CLI de Spark SQL
En los siguientes pasos, se muestra cómo crear una tabla de Iceberg con metadatos de la tabla almacenados en BigQuery Metastore con la CLI de Spark SQL que se ejecuta en el nodo principal de un clúster de Dataproc.
Usa SSH para conectarte al nodo principal de tu clúster de Dataproc.
En la terminal de la sesión de SSH, usa el editor de texto
vi
onano
para copiar los siguientes comandos en un archivoiceberg-table.sql
.SET CATALOG_NAME = `CATALOG_NAME`; SET BUCKET = `BUCKET`; SET WAREHOUSE_FOLDER = `WAREHOUSE_FOLDER`; USE `${CATALOG_NAME}`; CREATE NAMESPACE IF NOT EXISTS `${CATALOG_NAME}`.example_namespace; DROP TABLE IF EXISTS `${CATALOG_NAME}`.example_namespace.example_table; CREATE TABLE `${CATALOG_NAME}`.example_namespace.example_table (id int, data string) USING ICEBERG LOCATION 'gs://${BUCKET}/${WAREHOUSE_FOLDER}'; INSERT INTO `${CATALOG_NAME}`.example_namespace.example_table VALUES (1, 'first row'); ALTER TABLE `${CATALOG_NAME}`.example_namespace.example_table ADD COLUMNS (newDoubleCol double); DESCRIBE TABLE `${CATALOG_NAME}`.example_namespace.example_table;
Reemplaza lo siguiente:
- CATALOG_NAME: Es el nombre del catálogo de Iceberg.
- BUCKET y WAREHOUSE_FOLDER: Son el bucket y la carpeta de Cloud Storage que se usan para el almacén de Iceberg.
En la terminal de la sesión de SSH, ejecuta el siguiente comando
spark-sql
para crear la tabla del iceberg.spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.5.2 \ --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.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=gs://BUCKET/WAREHOUSE_FOLDER \ -f iceberg-table.sql
Reemplaza lo siguiente:
- PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de proyecto se enumeran en la sección Información del proyecto en el Panel de la consola de Google Cloud.
- LOCATION: Una ubicación de BigQuery compatible. La ubicación predeterminada es "US".
Cómo ver los metadatos de una tabla en BigQuery
En la consola de Google Cloud, ve a la página de BigQuery.
Visualiza los metadatos de la tabla de Iceberg.
Interfaz web de Zeppelin
En los siguientes pasos, se muestra cómo crear una tabla de Iceberg con metadatos de la tabla almacenados en BigQuery Metastore con la interfaz web de Zeppelin que se ejecuta en el nodo principal de un clúster de Dataproc .
En la consola de Google Cloud, ve a la página Clústeres de Dataproc.
Selecciona el nombre de tu clúster para abrir la página Detalles del clúster.
Haz clic en la pestaña Interfaces web para ver una lista de los vínculos de Puerta de enlace de componentes a las interfaces web de los componentes predeterminados y opcionales instalados en el clúster.
Haz clic en el vínculo Zeppelin para abrir la interfaz web de Zeppelin.
En la interfaz web de Zeppelin, haz clic en el menú anonymous y, luego, en Interpreter para abrir la página Interpreters.
Agrega dos archivos JAR al intérprete de Zeppelin Spark de la siguiente manera:
- Escribe "Spark" en el cuadro
Search interpreters
para desplazarte hasta la sección del intérprete de Spark. - Haga clic en editar.
Pega lo siguiente en el campo spark.jars:
https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.5.2/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.0-beta.jar
Haz clic en Guardar en la parte inferior de la sección del intérprete de Spark y, luego, en Aceptar para actualizar el intérprete y reiniciarlo con la configuración nueva.
- Escribe "Spark" en el cuadro
En el menú del notebook de Zeppelin, haz clic en Create new note.
En el diálogo Create new note, ingresa un nombre para el notebook y acepta el intérprete predeterminado spark. Haz clic en Crear para abrir el notebook.
Copia el siguiente código de PySpark en tu notebook de Zeppelin después de completar las variables.
%pyspark
from pyspark.sql import SparkSession
project_id = "PROJECT_ID" catalog = "CATALOG_NAME" namespace = "NAMESPACE" location = "LOCATION" warehouse_dir = "gs://BUCKET/WAREHOUSE_DIRECTORY"
spark = SparkSession.builder \ .appName("BigQuery Metastore Iceberg") \ .config(f"spark.sql.catalog.{catalog}", "org.apache.iceberg.spark.SparkCatalog") \ .config(f"spark.sql.catalog.{catalog}.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \ .config(f"spark.sql.catalog.{catalog}.gcp_project", f"{project_id}") \ .config(f"spark.sql.catalog.{catalog}.gcp_location", f"{location}") \ .config(f"spark.sql.catalog.{catalog}.warehouse", f"{warehouse_dir}") \ .getOrCreate()
spark.sql(f"USE `{catalog}`;") spark.sql(f"CREATE NAMESPACE IF NOT EXISTS `{namespace}`;") spark.sql(f"USE `{namespace}`;")
\# Create table and display schema (without LOCATION) spark.sql("DROP TABLE IF EXISTS example_iceberg_table") spark.sql("CREATE TABLE example_iceberg_table (id int, data string) USING ICEBERG") spark.sql("DESCRIBE example_iceberg_table;")
\# Insert table data. spark.sql("INSERT INTO example_iceberg_table VALUES (1, 'first row');")
\# Alter table, then display schema. spark.sql("ALTER TABLE example_iceberg_table ADD COLUMNS (newDoubleCol double);")
\# Select and display the contents of the table. spark.sql("SELECT * FROM example_iceberg_table").show()Reemplaza lo siguiente:
- PROJECT_ID: El ID de tu proyecto de Google Cloud . Los IDs de proyecto se enumeran en la sección Información del proyecto en el Panel de la consola de Google Cloud.
- CATALOG_NAME y NAMESPACE: El nombre y el espacio de nombres del catálogo de Iceberg se combinan para identificar la tabla de Iceberg (
catalog.namespace.table_name
). - LOCATION: Una ubicación de BigQuery compatible. La ubicación predeterminada es "US".
- BUCKET y WAREHOUSE_DIRECTORY: Bucket y carpeta de Cloud Storage que se usan como directorio del almacén de Iceberg.
Haz clic en el ícono de ejecución o presiona
Shift-Enter
para ejecutar el código. Cuando se completa el trabajo, el mensaje de estado muestra "Spark Job Finished" y el resultado muestra el contenido de la tabla:Cómo ver los metadatos de una tabla en BigQuery
En la consola de Google Cloud, ve a la página de BigQuery.
Visualiza los metadatos de la tabla de Iceberg.