Tablas de Apache Iceberg

Las tablas de Apache Iceberg administradas por BigQuery (anteriormente, tablas de BigLake para Apache Iceberg en BigQuery) proporcionan la base para compilar lakehouses de formato abierto en Google Cloud. Las tablas de Iceberg administradas ofrecen la misma experiencia completamente administrada que las tablas estándar de BigQuery, pero almacenan datos en buckets de almacenamiento que pertenecen al cliente. Las tablas de Iceberg administradas admiten el formato de tabla de Spark abierto para una mejor interoperabilidad con motores de procesamiento de código abierto y de terceros en una sola copia de los datos.

Las tablas Iceberg administradas admiten las siguientes funciones:

Arquitectura

Las tablas administradas de Iceberg brindan la comodidad de la administración de recursos de BigQuery a las tablas que residen en tus propios buckets de nube. Puedes usar BigQuery y motores de procesamiento de código abierto en estas tablas sin mover los datos fuera de los buckets que controlas. Debes configurar un bucket de Cloud Storage antes de comenzar a usar las tablas administradas de Iceberg.

Las tablas administradas de Iceberg utilizan el catálogo de tiempo de ejecución de Lakehouse como el catálogo de tiempo de ejecución unificado para todos los datos de Spark. El catálogo de tiempo de ejecución de Lakehouse proporciona una sola fuente de información para administrar los metadatos de varios motores y permite la interoperabilidad de los motores.

El uso de tablas de Apache Iceberg tiene las siguientes implicaciones en tu bucket:

  • BigQuery crea archivos de datos nuevos en el bucket en respuesta a solicitudes de escritura y optimizaciones de almacenamiento en segundo plano, como instrucciones DML y transmisión.
  • La compactación y el agrupamiento en clústeres automáticos se realizan en los archivos de datos del bucket. Después del vencimiento del período del viaje en el tiempo, se realiza la recolección de basura de los archivos de datos. Sin embargo, si se borra la tabla, no se realiza la recolección de registros no utilizados de los archivos de datos asociados. Para obtener más información, consulta Optimización del almacenamiento.

Crear una tabla de Spark es similar a crear tablas de BigQuery. Debido a que almacena datos en formatos abiertos en Cloud Storage, debes hacer lo siguiente:

  • Especifica la conexión de recursos de Cloud con WITH CONNECTION para configurar las credenciales de conexión de BigQuery y acceder a Cloud Storage.
  • Especifica el formato de archivo del almacenamiento de datos como PARQUET con la instrucción file_format = PARQUET.
  • Especifica el formato de tabla de metadatos de código abierto como ICEBERG con la declaración table_format = ICEBERG.

Prácticas recomendadas

Si cambias o agregas archivos directamente al bucket fuera de BigQuery, se pueden perder datos o producirse errores irrecuperables. En la siguiente tabla, se describen las situaciones posibles:

Operación Consecuencias Prevención
Agregar archivos nuevos al bucket fuera de BigQuery. Pérdida de datos: BigQuery no realiza un seguimiento de los archivos u objetos nuevos que se agregan fuera de BigQuery. Los procesos de recolección de elementos no utilizados en segundo plano borran los archivos sin seguimiento. Agregar datos exclusivamente a través de BigQuery. Esto permite que BigQuery haga un seguimiento de los archivos y evite que se recopilen como basura.
Para evitar la pérdida de datos y las incorporaciones accidentales, también te recomendamos restringir los permisos de escritura de herramientas externas en los buckets que contienen tablas de Iceberg administradas.
Crea una tabla de Spark nueva en un prefijo no vacío. Pérdida de datos: BigQuery no realiza un seguimiento de los datos existentes, por lo que estos archivos se consideran sin seguimiento y se borran con los procesos de recolección de elementos no utilizados en segundo plano. Solo crea tablas de Iceberg administradas nuevas en prefijos vacíos.
Modifica o reemplaza los archivos de datos de tablas de Spark. Pérdida de datos: En la modificación o el reemplazo externos, la tabla no pasa una verificación de coherencia y se vuelve ilegible. Las consultas a la tabla fallan.
No hay una forma de autoservicio para recuperarse de este punto. Comunícate con el equipo de asistencia para obtener ayuda con la recuperación de datos.
Modificar los datos exclusivamente a través de BigQuery. Esto permite que BigQuery haga un seguimiento de los archivos y evite que se recopilen como basura.
Para evitar la pérdida de datos y las incorporaciones accidentales, también te recomendamos restringir los permisos de escritura de herramientas externas en los buckets que contienen tablas de Iceberg administradas.
Crear dos tablas de Iceberg administradas en los mismos URIs o en URIs superpuestos. Pérdida de datos: BigQuery no establece una vinculación entre instancias de URI idénticas de tablas administradas de Iceberg. Los procesos de recolección de elementos no utilizados en segundo plano de cada tabla considerarán que los archivos de la tabla opuesta no tienen seguimiento y los borrarán, lo que provocará la pérdida de datos. Usar URIs únicos para cada tabla de Spark

Prácticas recomendadas para la configuración de bucket de Cloud Storage

La configuración de tu bucket de Cloud Storage y su conexión con BigQuery tienen un impacto directo en el rendimiento, el costo, la integridad de los datos, la seguridad y la administración de tus tablas de Iceberg administradas. Estas son algunas prácticas recomendadas para ayudarte con esta configuración:

  • Selecciona un nombre que indique claramente que el bucket solo está destinado a las tablas Iceberg administradas.

  • Elige buckets de Cloud Storage de una sola región que estén ubicados en la misma región que tu conjunto de datos de BigQuery. Esta coordinación mejora el rendimiento y reduce los costos, ya que evita los cargos por transferencia de datos.

  • De forma predeterminada, Cloud Storage almacena los datos en la clase de almacenamiento Standard Storage, que proporciona un rendimiento suficiente. Para optimizar los costos de almacenamiento de datos, puedes habilitar Autoclass para administrar automáticamente las transiciones de clases de almacenamiento. Autoclass comienza con la clase de almacenamiento Standard Storage y mueve los objetos a los que no se accede a clases progresivamente más frías para reducir los costos de almacenamiento. Cuando se vuelve a leer el objeto, se mueve de nuevo a la clase Standard.

  • Habilita el acceso uniforme a nivel del bucket y la prevención del acceso público.

  • Verifica que los roles requeridos estén asignados a los usuarios y las cuentas de servicio correctos.

  • Para evitar la eliminación o corrupción accidental de datos de Spark en tu bucket de Cloud Storage, restringe los permisos de escritura y eliminación para la mayoría de los usuarios de tu organización. Para ello, establece una política de permisos de bucket con condiciones que denieguen las solicitudes PUT y DELETE para todos los usuarios, excepto los que especifiques.

  • Aplica claves de encriptación administradas por Google o administradas por el cliente para proteger aún más los datos sensibles.

  • Habilita el registro de auditoría para la transparencia operativa, la solución de problemas y la supervisión del acceso a los datos.

  • Conserva la política de borrado de forma no definitiva predeterminada (retención de 7 días) para protegerte contra eliminaciones accidentales. Sin embargo, si detectas que se borraron datos de Spark, comunícate con el equipo de asistencia en lugar de restablecer objetos de forma manual, ya que BigQuery no realiza un seguimiento de los objetos que se agregan o modifican fuera de BigQuery.

  • El tamaño de archivo adaptable, el agrupamiento automático y la recolección de elementos no utilizados se habilitan automáticamente y ayudan a optimizar el rendimiento y el costo de los archivos.

  • Evita las siguientes funciones de Cloud Storage, ya que no son compatibles con las tablas administradas de Iceberg:

Puedes implementar estas prácticas recomendadas creando tu bucket con el siguiente comando:

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

Reemplaza lo siguiente:

  • BUCKET_NAME: Es el nombre de tu bucket nuevo.
  • PROJECT_ID: Es el ID del proyecto.
  • LOCATION: La ubicación de tu bucket nuevo

Flujos de trabajo de tablas de Spark

En las siguientes secciones, se describe cómo crear, cargar, administrar y consultar tablas administradas.

Antes de comenzar

Antes de crear y usar tablas administradas de Iceberg, asegúrate de haber configurado una conexión de recursos de Cloud a un bucket de almacenamiento. Tu conexión necesita permisos de escritura en el bucket de almacenamiento, como se especifica en la siguiente sección Roles obligatorios. Para obtener más información sobre los roles y permisos necesarios para las conexiones, consulta Administra conexiones.

Roles obligatorios

Para obtener los permisos que necesitas para permitir que BigQuery administre las tablas de tu proyecto, pídele a tu administrador que te otorgue los siguientes roles de IAM:

Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para permitir que BigQuery administre las tablas de tu proyecto. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para permitir que BigQuery administre las tablas de tu proyecto:

  • Todos:
    • bigquery.connections.delegate en tu proyecto
    • bigquery.jobs.create en tu proyecto
    • bigquery.readsessions.create en tu proyecto
    • bigquery.tables.create en tu proyecto
    • bigquery.tables.get en tu proyecto
    • bigquery.tables.getData en tu proyecto
    • storage.buckets.get en tu bucket
    • storage.objects.create en tu bucket
    • storage.objects.delete en tu bucket
    • storage.objects.get en tu bucket
    • storage.objects.list en tu bucket

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Crea tablas administradas de Iceberg

Para crear una tabla de Spark, selecciona uno de los siguientes métodos:

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');

Reemplaza lo siguiente:

  • PROJECT_ID: Es el proyecto que contiene el conjunto de datos. Si no se define, el comando supone el proyecto predeterminado.
  • DATASET_ID: Es un conjunto de datos existente.
  • TABLE_NAME: es el nombre de la tabla que crearás.
  • DATA_TYPE: Es el tipo de datos de la información que se incluye en la columna.
  • CLUSTER_COLUMN_LIST (opcional): Es una lista separada por comas que contiene hasta cuatro columnas. Deben ser columnas de nivel superior que no se repitan.
  • CONNECTION_NAME: Es el nombre de la conexión. Por ejemplo, myproject.us.myconnection.

Para usar una conexión predeterminada, especifica DEFAULT en lugar de la cadena de conexión que contiene PROJECT_ID.REGION.CONNECTION_ID.

  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado. Por ejemplo, gs://mybucket/table.

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el proyecto que contiene el conjunto de datos. Si no se define, el comando supone el proyecto predeterminado.
  • CONNECTION_NAME: Es el nombre de la conexión. Por ejemplo, myproject.us.myconnection.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado. Por ejemplo, gs://mybucket/table.
  • COLUMN_NAME: El nombre de la columna.
  • DATA_TYPE: Es el tipo de datos de la información que se incluye en la columna.
  • CLUSTER_COLUMN_LIST (opcional): Es una lista separada por comas que contiene hasta cuatro columnas. Deben ser columnas de nivel superior que no se repitan.
  • DATASET_ID: Es el ID de un conjunto de datos existente.
  • MANAGED_TABLE_NAME: es el nombre de la tabla que crearás.

API

Llama al método tables.insert con un recurso de tabla definido, similar al siguiente:

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

Reemplaza lo siguiente:

  • TABLE_NAME: Es el nombre de la tabla que crearás.
  • CONNECTION_NAME: Es el nombre de la conexión. Por ejemplo, myproject.us.myconnection.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado. También se admiten comodines. Por ejemplo, gs://mybucket/table.
  • COLUMN_NAME: El nombre de la columna.
  • DATA_TYPE: Es el tipo de datos de la información que se incluye en la columna.

Importa datos a tablas administradas de Iceberg

En las siguientes secciones, se describe cómo importar datos de varios formatos de tablas a tablas administradas de Iceberg.

Carga datos estándar desde archivos planos

Las tablas administradas de Iceberg usan trabajos de carga de BigQuery para cargar archivos externos en tablas administradas de Iceberg. Si tienes una tabla de Spark existente, sigue la guía de la CLI de bq load o la guía de SQL de LOAD para cargar datos externos. Después de cargar los datos, se escriben archivos Parquet nuevos en la carpeta STORAGE_URI/data.

Si se usan las instrucciones anteriores sin una tabla de Spark existente, se creará una tabla de BigQuery.

Consulta lo siguiente para ver ejemplos específicos de herramientas de cargas por lotes en tablas administradas:

SQL

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

Reemplaza lo siguiente:

  • MANAGED_TABLE_NAME: Es el nombre de una tabla de Spark existente.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado o una lista separada por comas de URI. También se admiten comodines. Por ejemplo, gs://mybucket/table.
  • FILE_FORMAT: Es el formato de la tabla de origen. Para conocer los formatos compatibles, consulta la fila format de load_option_list.

bq

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

Reemplaza lo siguiente:

  • FILE_FORMAT: Es el formato de la tabla de origen. Para conocer los formatos compatibles, consulta la fila format de load_option_list.
    • MANAGED_TABLE_NAME: Es el nombre de una tabla de Apache Iceberg existente.
  • STORAGE_URI: Es un URI de Cloud Storage completamente calificado o una lista separada por comas de URI. También se admiten comodines. Por ejemplo, gs://mybucket/table.

Carga estándar desde archivos particionados por Apache Hive

Puedes cargar archivos particionados por Apache Hive en tablas administradas de Iceberg con trabajos de carga estándar de BigQuery. Para obtener más información, consulta Carga datos con particiones externas.

Carga datos de transmisión desde Pub/Sub

Puedes cargar datos de transmisión en tablas administradas de Iceberg con una suscripción de BigQuery a Pub/Sub.

Exporta datos de tablas administradas de Iceberg

En las siguientes secciones, se describe cómo exportar datos de tablas administradas de Iceberg a varios formatos de tabla.

Exporta datos a formatos planos

Para exportar una tabla de Spark a un formato plano, usa la sentencia EXPORT DATA y selecciona un formato de destino. Para obtener más información, consulta Cómo exportar datos.

Crea instantáneas de metadatos de tablas de Spark

Para crear una instantánea de metadatos de la tabla de Spark, sigue estos pasos:

  1. Exporta los metadatos al formato Spark V2 con la instrucción SQL EXPORT TABLE METADATA.

  2. Opcional: Programa la actualización de la instantánea de metadatos de Spark. Para actualizar una instantánea de metadatos de Spark según un intervalo de tiempo establecido, usa una consulta programada.

  3. Opcional: Habilita la actualización automática de metadatos para que tu proyecto actualice automáticamente la instantánea de metadatos de la tabla de Spark en cada mutación de la tabla. Para habilitar la actualización automática de metadatos, comunícate con bigquery-tables-for-apache-iceberg-help@google.com. Se aplican costos de EXPORT METADATA en cada operación de actualización.

En el siguiente ejemplo, se crea una consulta programada llamada My Scheduled Snapshot Refresh Query con la instrucción DDL EXPORT TABLE METADATA FROM mydataset.test. La instrucción DDL se ejecuta cada 24 horas.

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

Visualiza la instantánea de metadatos de la tabla de Spark

Después de actualizar la instantánea de metadatos de la tabla de Spark, puedes encontrarla en el URI de Cloud Storage en el que se creó originalmente la tabla de Spark. La carpeta /data contiene los fragmentos de datos del archivo Parquet, y la carpeta /metadata contiene la instantánea de los metadatos de la tabla de Spark.

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

Ten en cuenta que mydataset y table_name son marcadores de posición para tu conjunto de datos y tabla reales.

Cómo leer tablas de Iceberg administradas con Spark

En el siguiente ejemplo, se configura tu entorno para usar Spark SQL con Spark y, luego, se ejecuta una consulta para recuperar datos de una tabla de Spark especificada.

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;

Reemplaza lo siguiente:

  • ICEBERG_VERSION_NUMBER: Es la versión actual del entorno de ejecución de Spark. Descarga la versión más reciente de Spark Releases.
  • CATALOG_NAME: Es el catálogo para hacer referencia a tu tabla de Spark.
  • BUCKET_PATH: Es la ruta de acceso al bucket que contiene los archivos de la tabla. Por ejemplo, gs://mybucket/
  • FOLDER_NAME: Es la carpeta que contiene los archivos de la tabla. Por ejemplo, myfolder.

Modifica tablas administradas de Iceberg

Para modificar una tabla de Spark, sigue los pasos que se muestran en Modifica esquemas de tablas.

Usa transacciones de varias instrucciones

Para obtener acceso a las transacciones de varias declaraciones para las tablas Iceberg administradas, completa el formulario de registro.

Usa la partición

Para obtener acceso al particionamiento de las tablas de Apache Iceberg, completa el formulario de registro.

Para particionar una tabla, especifica una columna de partición que se usará para segmentar la tabla. Se admiten los siguientes tipos de columnas para las tablas Iceberg administradas:

  • DATE
  • DATETIME
  • TIMESTAMP

La partición de una tabla en una columna DATE, DATETIME o TIMESTAMP se conoce como partición de columna de unidad de tiempo. Puedes elegir si las particiones tienen un nivel de detalle por hora, día, mes o año.

Las tablas Iceberg administradas también admiten el agrupamiento en clústeres y la combinación de tablas agrupadas en clústeres y particionadas.

Limitaciones de la partición

Crea una tabla de Spark particionada

Para crear una tabla de Spark particionada, sigue las instrucciones para crear una tabla de Spark estándar y, luego, incluye una de las siguientes opciones, según tu entorno:

Modifica y consulta tablas de Iceberg administradas particionadas

Las instrucciones y consultas del lenguaje de manipulación de datos (DML) de BigQuery para las tablas de Iceberg administradas particionadas son las mismas que para las tablas de Spark estándar. BigQuery automáticamente define el alcance del trabajo para las particiones correctas, de manera similar a la particionamiento oculto de Spark. Además, los datos nuevos que agregues a la tabla se particionarán automáticamente.

También puedes consultar tablas de Iceberg administradas particionadas con otros motores de la misma manera que las tablas de Iceberg administradas estándar. Para obtener la mejor experiencia, te recomendamos que habilites las instantáneas de metadatos.

Para mejorar la seguridad, la información de partición de las tablas Iceberg administradas se desacopla de la ruta de acceso a los datos y se administra por completo a través de la capa de metadatos.

Precios

Los precios de las tablas de Spark incluyen el almacenamiento, la optimización del almacenamiento, y las consultas y los trabajos.

Almacenamiento

Las tablas de Iceberg administradas almacenan todos los datos en Cloud Storage. Se te cobra por todos los datos almacenados, incluidos los datos históricos de las tablas. También se pueden aplicar los cargos de transferencia y el procesamiento de datos de Cloud Storage. Es posible que se eximan algunas tarifas de operaciones de Cloud Storage para las operaciones que se procesan a través de BigQuery o la API de BigQuery Storage. No hay tarifas de almacenamiento específicas de BigQuery. Para obtener más información, consulta los Precios de Cloud Storage.

Optimización del almacenamiento

Las tablas administradas de Iceberg realizan la administración automática de tablas, lo que incluye la compactación, el agrupamiento en clústeres, la recolección de elementos no utilizados y la generación o actualización de metadatos de BigQuery para optimizar el rendimiento de las consultas y reducir los costos de almacenamiento. El uso de recursos de procesamiento para la administración de tablas se factura en unidades de procesamiento de datos (DCU) a lo largo del tiempo, en incrementos por segundo. Para obtener más detalles, consulta los precios de las tablas de Apache Iceberg.

Las operaciones de exportación de datos que se realizan durante la transmisión a través de la API de Storage Write se incluyen en los precios de la API de Storage Write y no se cobran como mantenimiento en segundo plano. Para obtener más información, consulta Precios por transferencia de datos.

Para ver los registros y el uso de procesamiento de estas operaciones en segundo plano, consulta la vista INFORMATION_SCHEMA.JOBS. Para ver ejemplos de consultas, consulta lo siguiente:

Consultas y trabajos

Al igual que con las tablas de BigQuery, se te cobra por las consultas y los bytes leídos (por TiB) si usas los precios según demanda de BigQuery o el consumo de ranuras (por ranura-hora) si usas los precios de procesamiento de capacidad de BigQuery.

Los precios de BigQuery también se aplican a la API de BigQuery Storage Read y a la API de Storage Write.

Las operaciones de carga y exportación (como EXPORT METADATA) usan ranuras de pago por uso de la edición Enterprise. Esto difiere de las tablas de BigQuery, que no se cobran por estas operaciones. Si hay reservas PIPELINE con ranuras de Enterprise o Enterprise Plus disponibles, las operaciones de carga y exportación usan de preferencia estas ranuras de reserva.

Limitaciones

Las tablas administradas de Iceberg tienen las siguientes limitaciones: