Componente opcional de Iceberg de Managed Service for Apache Spark

El componente opcional de Iceberg te permite administrar tablas de data lakehouse con transacciones ACID y evolución de esquemas en clústeres de Managed Service para Apache Spark. Puedes instalar Iceberg durante la creación del clúster con la función Componentes opcionales para consultar y actualizar tablas en las cargas de trabajo de Spark y Hive.

Funciones clave de Iceberg

Entre las funciones de Iceberg, se incluyen las siguientes:

  • Evolución del esquema: Agrega, quita o cambia el nombre de las columnas sin volver a escribir toda la tabla.
  • Viaje en el tiempo: Consulta instantáneas de tablas históricas con fines de auditoría o reversión.
  • Particionamiento oculto: Optimiza el diseño de los datos para realizar consultas más rápidas sin exponer los detalles de la partición a los usuarios.
  • Transacciones ACID: Garantizan la coherencia de los datos y evitan conflictos.

Cuando creas un clúster de Managed Service para Apache Spark con Iceberg, las siguientes propiedades de Spark y Hive se configuran para funcionar con Iceberg.

Versión de imagen 2.x

Las siguientes propiedades de Spark y Hive se configuran en los clústeres de Managed Service para Apache Spark `2.x` cuando se instala el componente de Iceberg:

Archivo de configuración Propiedad Valor predeterminado
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.driver.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
spark.executor.extraClassPath /usr/lib/iceberg/lib/iceberg-spark-runtime-spark-version_scala-version.jar
/etc/hive/conf/hive-site.xml hive.aux.jars.path file:///usr/lib/iceberg/lib/iceberg-hive-runtime.jar
iceberg.engine.hive.enabled true

Versión de imagen 3.0

Las siguientes propiedades de Spark y Hive se configuran en los clústeres de Managed Service para Apache Spark `3.0` cuando se instala el componente de Iceberg:

Archivo de configuración Propiedad Valor predeterminado
/etc/spark/conf/spark-defaults.conf spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
spark.sql.catalog.default_iceberg org.apache.iceberg.spark.SparkCatalog
spark.sql.catalog.default_iceberg.type rest
spark.sql.catalog.default_iceberg.uri env:ICEBERG_REST_CATALOG_URI
/etc/hive/conf/hive-site.xml iceberg.engine.hive.enabled true

Instala el componente opcional de Iceberg

Puedes instalar el componente de Iceberg en los clústeres de Managed Service para Apache Spark creados con las versiones de imagen 2.2.47 y posteriores. En las páginas de la lista de versiones de imágenes de clústeres de Managed Service para Apache Spark, se muestra la versión del componente de Iceberg incluida en las versiones de imágenes de clústeres de Managed Service para Apache Spark más recientes.

Consola deGoogle Cloud

Para crear un clúster de Managed Service para Apache Spark que instale el componente de Iceberg, completa los siguientes pasos en la consola de Google Cloud :

  1. Abre la página Crear clúster.
  2. Haz clic en Configuración adicional para expandir esa sección.
  3. Edita los componentes opcionales.
  4. En el panel que se abre, selecciona la casilla de verificación de Iceberg.
  5. Haz clic en Guardar.

gcloud CLI

Para crear un clúster de Managed Service para Apache Spark que instale el componente de Iceberg, usa el comando gcloud dataproc clusters create con la marca --optional-components.

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --optional-components=ICEBERG \
     other flags ...

Reemplaza lo siguiente:

API de REST

Para crear un clúster de Managed Service para Apache Spark que instale el componente opcional de Iceberg, especifica el SoftwareConfig.Component de Iceberg como parte de una solicitud clusters.create.

Usa tablas de Iceberg con Spark y Hive

Después de crear un clúster de Managed Service para Apache Spark que tenga el componente opcional de Iceberg instalado en el clúster, puedes usar Spark y Hive para leer y escribir datos de tablas de Iceberg.

Spark

Configura una sesión de Spark para Iceberg

Puedes usar el comando de gcloud CLI de forma local o los REPL (bucles de lectura, evaluación y salida) de spark-shell o pyspark que se ejecutan en el nodo instancia principal del clúster de Dataproc para habilitar las extensiones de Spark de Iceberg y configurar el catálogo de Spark para usar tablas de Iceberg.

gcloud

Ejecuta el siguiente ejemplo de gcloud CLI en una ventana de terminal local o en Cloud Shell para enviar un trabajo de Spark y establecer las propiedades de Spark para configurar la sesión de Spark para Iceberg.

gcloud dataproc jobs submit spark  \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties="spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog" \
    --properties="spark.sql.catalog.CATALOG_NAME.type=hadoop" \
    --properties="spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/FOLDER" \
     other flags ...

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster.
  • REGION: Es la región de Compute Engine.
  • CATALOG_NAME: Es el nombre del catálogo de Iceberg.
  • BUCKET y FOLDER: Es la ubicación del catálogo de Iceberg en Cloud Storage.

spark-shell

Para configurar una sesión de Spark para Iceberg con el REPL de spark-shell en el clúster de Managed Service para Apache Spark, completa los siguientes pasos:

  1. Usa SSH para conectarte al nodo principal del clúster de Managed Service para Apache Spark.

  2. Ejecuta el siguiente comando en la terminal de la sesión de SSH para configurar la sesión de Spark para Iceberg.

spark-shell \
    --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --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=gs://BUCKET/FOLDER"

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster.
  • REGION: Es la región de Compute Engine.
  • CATALOG_NAME: Es el nombre del catálogo de Iceberg.
  • BUCKET y FOLDER: Es la ubicación del catálogo de Iceberg en Cloud Storage.

shell de pyspark

Para configurar una sesión de Spark para Iceberg con el REPL de pyspark en el clúster de Managed Service para Apache Spark, completa los siguientes pasos:

  1. Usa SSH para conectarte al nodo principal del clúster de Managed Service para Apache Spark.

  2. Ejecuta el siguiente comando en la terminal de la sesión de SSH para configurar la sesión de Spark para Iceberg:

pyspark \
    --conf "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" \
    --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=gs://BUCKET/FOLDER"

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster.
  • REGION: Es la región de Compute Engine.
  • CATALOG_NAME: Es el nombre del catálogo de Iceberg.
  • BUCKET y FOLDER: Es la ubicación del catálogo de Iceberg en Cloud Storage.

Escribe datos en una tabla de Iceberg

Puedes escribir datos en una tabla de Iceberg con Spark. En los siguientes fragmentos de código, se crea un DataFrame con datos de muestra, se crea una tabla de Iceberg en Cloud Storage y, luego, se escriben los datos en la tabla de Iceberg.

PySpark

# Create a DataFrame with sample data.
data = spark.createDataFrame([(1, "Alice"), (2, "Bob")], ["id", "name"])

# Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

# Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Scala

// Create a DataFrame with sample data.
val data = Seq((1, "Alice"), (2, "Bob")).toDF("id", "name")

// Create an Iceberg table in Cloud Storage.
spark.sql("""CREATE TABLE IF NOT EXISTS CATALOG_NAME.NAMESPACE.TABLE_NAME (
    id integer,
    name string)
USING iceberg
LOCATION 'gs://BUCKET/FOLDER/NAMESPACE/TABLE_NAME'""")

// Write the DataFrame to the Iceberg table in Cloud Storage.
data.writeTo("CATALOG_NAME.NAMESPACE.TABLE_NAME").append()

Lee datos de una tabla de Iceberg

Puedes leer datos de una tabla de Iceberg con Spark. En los siguientes fragmentos de código, se lee la tabla y, luego, se muestra su contenido.

PySpark

# Read Iceberg table data into a DataFrame.
df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")
# Display the data.
df.show()

Scala

// Read Iceberg table data into a DataFrame.
val df = spark.read.format("iceberg").load("CATALOG_NAME.NAMESPACE.TABLE_NAME")

// Display the data.
df.show()

Spark SQL

SELECT * FROM CATALOG_NAME.NAMESPACE.TABLE_NAME

Hive

Crea una tabla de Iceberg en Hive

Los clústeres de Managed Service para Apache Spark preconfiguran Hive para que funcione con Iceberg.

Para ejecutar los fragmentos de código de esta sección, completa los siguientes pasos:

  1. Usa SSH para conectarte al nodo principal de tu clúster de Managed Service para Apache Spark.

  2. Abre beeline en la ventana de terminal SSH.

    beeline -u jdbc:hive2://
    

Puedes crear una tabla de Iceberg particionada o no particionada en Hive.

Tabla no particionada

Crea una tabla de Iceberg sin particiones en Hive.

CREATE TABLE my_table (
  id INT,
  name STRING,
  created_at TIMESTAMP
) STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Tabla particionada

Crea una tabla de Iceberg particionada en Hive especificando las columnas de partición en la cláusula PARTITIONED BY.

CREATE TABLE my_partitioned_table (
  id INT,
  name STRING
) PARTITIONED BY (date_sk INT)
STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler';

Inserta datos en una tabla de Iceberg en Hive

Puedes insertar datos en una tabla de Iceberg con declaraciones INSERT estándar de Hive.

SET hive.execution.engine=mr;

INSERT INTO my_table
SELECT 1, 'Alice', current_timestamp();

Limitaciones

  • El motor de ejecución de MR (MapReduce) solo se admite para las operaciones de DML (lenguaje de manipulación de datos).
  • La ejecución de MR dejó de estar disponible en Hive 3.1.3.

Lee datos de una tabla de Iceberg en Hive

Para leer datos de una tabla de Iceberg, usa una sentencia SELECT.

SELECT * FROM my_table;

Descarta una tabla de Iceberg en Hive.

Para descartar una tabla de Iceberg en Hive, usa la sentencia DROP TABLE.

DROP TABLE my_table;

¿Qué sigue?