Configura Spark y Hive con el catálogo de entorno de ejecución de Lakehouse

En este documento, se explica cómo configurar Apache Spark y Apache Hive para usar el catálogo del entorno de ejecución de Lakehouse. Aprenderás a crear un catálogo de Apache Hive, configurar tus sesiones de Spark para conectarte al metastore y ejecutar cargas de trabajo para crear tablas que puedas consultar directamente en BigQuery.

Antes de comenzar

  1. Lee Acerca de los catálogos de Hive en el catálogo de entorno de ejecución de Lakehouse para comprender cómo se conecta Spark al catálogo de entorno de ejecución de Lakehouse.
  2. Revisa los formatos de almacenamiento y tipos de datos admitidos.
  3. Revisa las limitaciones y consideraciones.
  4. Accede a tu cuenta de Google Cloud . Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  5. Verify that billing is enabled for your Google Cloud project.

  6. Enable the Lakehouse for Apache Iceberg, Dataproc API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Lakehouse for Apache Iceberg, Dataproc API APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

Roles obligatorios

Para obtener los permisos que necesitas para usar el catálogo del entorno de ejecución de Lakehouse, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

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.

Para obtener instrucciones, consulta Cómo otorgar un solo rol.

Flujo de trabajo general

Para usar el catálogo de entorno de ejecución de Lakehouse con Spark y Hive, sigue este flujo de trabajo general:

  1. Crea un catálogo de Hive de Lakehouse para Apache Iceberg.
  2. Configura tu sesión de Spark con tu herramienta preferida (como Managed Service para Apache Spark o BigQuery Studio).
  3. Realiza operaciones de bases de datos y tablas dentro de tu sesión de Spark.
  4. Envía cargas de trabajo por lotes a Managed Service para Apache Spark y consulta las tablas resultantes directamente desde BigQuery.

Crea un catálogo de Hive de Lakehouse

Para usar el catálogo de entorno de ejecución de Lakehouse con Spark y Hive, primero debes crear un catálogo de Hive.

Un catálogo de Hive de Lakehouse es una colección de bases de datos de Hive. Antes de ejecutar trabajos de Spark, crea un catálogo para registrarlo en el metastore de Lakehouse. El catálogo tiene un nombre y una ubicación de Cloud Storage en la que residen los datos de Hive.

Console

  1. En la consola de Google Cloud , abre la página Lakehouse.

    Ir a Lakehouse

  2. Haz clic en Crear catálogo.

  3. Selecciona Catálogo de entorno de ejecución de Lakehouse.

  4. En Tipo de catálogo, selecciona Hive Metastore.

  5. En el campo Selecciona un bucket de Cloud Storage, ingresa el nombre del bucket de Cloud Storage que deseas usar con tu catálogo. Como alternativa, haz clic en Explorar para elegir un bucket existente o crear uno nuevo.

  6. En ID del catálogo, asigna un nombre a tu catálogo de Hive de Lakehouse.

  7. En Ubicación principal, especifica la misma región que tu bucket.

  8. Haz clic en Crear.

gcloud

Para crear un catálogo de Hive, ejecuta el siguiente comando:

gcloud biglake hive catalogs create LAKEHOUSE_CATALOG_ID \
    --project=PROJECT_ID
    --location-uri="gs://GCS_WAREHOUSE_PATH" \
    --primary_location=REGION \
    --description="DESCRIPTION"

Reemplaza lo siguiente:

  • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

  • GCS_WAREHOUSE_PATH: Es la ruta de acceso de Cloud Storage que almacena tu almacén de Hive.

  • PROJECT_ID: Es el ID del proyecto de Google Cloud.

  • REGION: Es la región principal del metastore. En el caso de los buckets de una sola región, debe coincidir con la región del bucket. En el caso de los buckets birregionales o multirregionales, debe ser una de las regiones constituyentes y donde se prevé la réplica principal del metastore. La otra región se convierte en la réplica secundaria.

  • DESCRIPTION: Es una descripción del catálogo.

curl

  1. Para crear un catálogo de Hive, ejecuta el siguiente comando:
curl -X POST -s -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
-d '{"locationUri": "gs://GCS_WAREHOUSE_PATH", "description": "DESCRIPTION"}' \
-H "Content-Type:application/json" \ "https://biglake.googleapis.com/hive/v1/projects/PROJECT_ID/catalogs?hiveCatalogId=LAKEHOUSE_CATALOG_ID&primary_location=REGION"

Reemplaza lo siguiente:

  • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

  • GCS_WAREHOUSE_PATH: Es la ruta de acceso de Cloud Storage que almacena tu almacén de Hive.

  • PROJECT_ID: Es el ID del proyecto de Google Cloud .

  • REGION: Es la región principal del metastore. En el caso de los buckets de una sola región, debe coincidir con la región del bucket. En el caso de los buckets de doble región o multirregionales, debe ser una de las regiones constituyentes y donde se prevé la réplica principal del metastore. La otra región se convierte en la réplica secundaria.

  • DESCRIPTION: Es una descripción del catálogo.

Configura y usa Spark y Hive

Para usar el catálogo del entorno de ejecución de Lakehouse, debes configurar tu sesión de Spark con propiedades específicas. Puedes establecer estas propiedades cuando creas un clúster de Managed Service para Apache Spark o especificarlas cada vez que creas una sesión.

Estas propiedades incluyen detalles como la fábrica de clientes, Google Cloudel ID del proyecto, el catálogo predeterminado y el directorio del almacén. Después de establecer la sesión, puedes realizar operaciones fundamentales, como enumerar las bases de datos existentes, crear bases de datos nuevas, definir tablas e insertar datos.

spark-sql

  1. Usa SSH para conectarte al nodo principal de tu clúster de Managed Service para Apache Spark.
  2. Ejecuta spark-sql en la línea de comandos con las siguientes propiedades para iniciar una sesión interactiva de Spark SQL:

    spark-sql \
        --conf spark.hive.metastore.client.factory.class=com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory \
        --conf spark.hive.metastore.blms.project.id=PROJECT_ID \
        --conf spark.hive.metastore.blms.catalog.default=LAKEHOUSE_CATALOG_ID \
        --conf spark.hive.metastore.warehouse.dir=gs://GCS_WAREHOUSE_PATH
    
  3. Después de que se inicia la sesión, Spark se conecta al catálogo del entorno de ejecución de Lakehouse.

    Ejecuta los siguientes comandos para crear recursos y realizar consultas sobre ellos:

    
    -- Show all the databases in the current project.
    SHOW DATABASES;
    
    -- Create a database.
    CREATE DATABASE spark_blms_database;
    
    -- Create a Parquet datasource table.
    CREATE TABLE spark_blms_database.parquet_quick_start (id INT, name STRING) USING PARQUET;
    
    -- Insert data into the table.
    INSERT INTO TABLE spark_blms_database.parquet_quick_start VALUES (1, 'my-first-user');
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

    • GCS_WAREHOUSE_PATH: Es la ruta de Cloud Storage que almacena tu almacén de Hive.

Notebook de Jupyter

  1. Completa las instrucciones para ejecutar un notebook de Jupyter en un clúster de Managed Service para Apache Spark.
  2. Accede a la interfaz web de Jupyter desde la pestaña Interfaces web de la página de detalles del clúster en la Google Cloud consola.
  3. En un notebook nuevo, crea una sesión de Spark y, luego, ejecuta las siguientes consultas:

    from pyspark.sql import SparkSession
    
    # If a Spark session exists, stop it first by running spark.stop()
    spark = SparkSession.builder\
        .master("local")\
        .appName("Lakehouse runtime catalog tutorial")\
        .config("spark.hive.metastore.client.factory.class", "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory")\
        .config("spark.hive.metastore.blms.project.id", "PROJECT_ID")\
        .config("spark.hive.metastore.warehouse.dir", "gs://GCS_WAREHOUSE_PATH")\
        .config("spark.hive.metastore.blms.catalog.default", "LAKEHOUSE_CATALOG_ID")\
        .getOrCreate()
    
    # Show all the databases.
    df = spark.sql("SHOW DATABASES;")
    df.show()
    
    # Create a database.
    spark.sql("CREATE DATABASE jupyter_blms_db")
    
    # Create a Parquet datasource table.
    spark.sql("CREATE TABLE jupyter_blms_db.parquet_table(id INT, name STRING) USING PARQUET")
    
    # Insert data into the table.
    spark.sql("INSERT INTO TABLE jupyter_blms_db.parquet_table VALUES (1, 'my-first-user');")
    
    # Query from table.
    spark.sql("SELECT * FROM jupyter_blms_db.parquet_table;").show()
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    • GCS_WAREHOUSE_PATH: Es la ruta de Cloud Storage que almacena tu almacén de Hive.

    • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

Notebook de BigQuery

  1. En la consola de Google Cloud , ve a BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haz clic en + AGREGAR y, luego, en Notebook de Python.

  3. En una celda de código, configura las propiedades del catálogo del entorno de ejecución de Lakehouse y de la sesión de Managed Service para Apache Spark:

    from google.cloud.dataproc_spark_connect import DataprocSparkSession
    from google.cloud.dataproc_v1 import Session
    import os
    
    os.environ['DATAPROC_SPARK_CONNECT_DEFAULT_DATASOURCE'] = ""
    
    session = Session()
    session.environment_config.execution_config.ttl = {"seconds": 864000}
    session.runtime_config.version = "2.3"
    session.runtime_config.properties = {
     "spark.hive.metastore.blms.project.id": "PROJECT_ID",
     "spark.hive.metastore.blms.catalog.default": "LAKEHOUSE_CATALOG_ID",
     "spark.hive.metastore.warehouse.dir": "gs://GCS_WAREHOUSE_PATH",
     "spark.hive.metastore.client.factory.class": "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory",
     "spark.sql.catalogImplementation": "hive"
    }
    
    spark = DataprocSparkSession.builder.dataprocSessionConfig(session).getOrCreate()
    print("Spark session created successfully")
    
  4. En otra celda de código, crea una base de datos y una tabla:

    # Create a database
    spark.sql("CREATE DATABASE bq_spark_blms_database;")
    
    # Create a parquet datasource table
    spark.sql("CREATE TABLE bq_spark_blms_database.parquet_quick_start (id INT, name STRING) USING PARQUET;")
    
    # Insert data into the table
    spark.sql("INSERT INTO TABLE bq_spark_blms_database.parquet_quick_start VALUES (1, 'my-first-user');")
    
    # Query from table
    spark.sql("select * from bq_spark_blms_database.parquet_quick_start;").show()
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    • GCS_WAREHOUSE_PATH: Es la ruta de Cloud Storage que almacena tu almacén de Hive.

    • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

CLI de Hive

Para usar la CLI de Hive, debes configurarla para que se conecte al metastore. Puedes hacerlo de dos maneras:

  • Opción 1: Configuración permanente. Actualiza el archivo /etc/hive/conf/hive-site.xml en tu nodo principal.
  • Opción 2: Configuración temporal. Proporciona marcas de configuración cuando inicies la CLI.

Para configurar la CLI y ejecutar tu sesión de consultas, sigue estos pasos:

  1. Usa SSH para conectarte al nodo principal de tu clúster de Managed Service para Apache Spark.
  2. Según tu método de configuración, realiza una de las siguientes acciones:

    • Para configurar de forma permanente (opción 1):

      1. Abre /etc/hive/conf/hive-site.xml en el nodo principal y agrega las siguientes propiedades:

        <property>
            <name>hive.metastore.blms.project.id</name>
            <value>PROJECT_ID</value>
            <description></description>
        </property>
        
        <property>
            <name>hive.metastore.client.factory.class</name>
            <value>com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory</value>
            <description></description>
        </property>
        <property>
            <name>hive.metastore.blms.catalog.default</name>
            <value>LAKEHOUSE_CATALOG_ID</value>
            <description></description>
        </property>
        <property>
            <name>hive.metastore.warehouse.dir</name>
            <value>gs://GCS_WAREHOUSE_PATH</value>
            <description></description>
        </property>
        
      2. Inicia la CLI de Hive:

        hive
        
    • Para configurar temporalmente en el inicio (opción 2): Inicia la CLI de Hive con marcas de configuración:

      hive \
      --hiveconf hive.metastore.blms.project.id="PROJECT_ID" \
      --hiveconf hive.metastore.blms.catalog.default="LAKEHOUSE_CATALOG_ID" \
      --hiveconf hive.metastore.client.factory.class=com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory \
      --hiveconf hive.metastore.warehouse.dir="gs://GCS_WAREHOUSE_PATH"
      
  3. Luego, ejecuta los siguientes comandos en la sesión de la CLI de Hive:

    show databases;
    create database hive_query_test;
    create table hive_query_test.parquet_table (id INT, name STRING) stored as PARQUET;
    select * from hive_query_test.parquet_table;
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

    • GCS_WAREHOUSE_PATH: Es la ruta de Cloud Storage que almacena tu almacén de Hive.

Envía un trabajo por lotes de Managed Service para Apache Spark

Puedes enviar una carga de trabajo por lotes de PySpark a Managed Service para Apache Spark que use el catálogo de entornos de ejecución de Lakehouse.

Este fragmento de PySpark inicializa una sesión de Spark configurada para conectarse con el catálogo del entorno de ejecución de Lakehouse. Establece propiedades esenciales,como la fábrica de clientes de Lakehouse, el ID del proyecto Google Cloud , el catálogo predeterminado y el directorio del almacén. Después de establecer la sesión, el código muestra cómo enumerar las bases de datos existentes, crear una nueva y definir una tabla con formato Parquet dentro de esa base de datos con comandos de Spark SQL.

  1. Crea un archivo de Python con un trabajo de PySpark:

    from pyspark.sql import SparkSession
    
    spark = (
        SparkSession.builder.appName("Lakehouse runtime catalog tutorial")
        .config(
           "spark.hive.metastore.client.factory.class",
    "com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory")
        .config("spark.hive.metastore.blms.project.id", "PROJECT_ID")
        .config("spark.hive.metastore.blms.catalog.default", "LAKEHOUSE_CATALOG_ID")
        .config(
            "spark.hive.metastore.warehouse.dir",
            "gs://GCS_WAREHOUSE_PATH",
        )
        .enableHiveSupport()
        .getOrCreate()
    )
    
    # Show all the databases.
    spark.sql("SHOW DATABASES;").show()
    
    # Create a database.
    spark.sql("CREATE DATABASE dp_serverless_test")
    
    # Create a Parquet datasource table.
    spark.sql(
            "CREATE TABLE dp_serverless_test.parquet_table(id INT, name STRING) USING"
            " PARQUET"
        )
    
    # Query from table.
    spark.sql("SELECT * from  dp_serverless_test.parquet_table").show()
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el ID del proyecto de Google Cloud .

    • LAKEHOUSE_CATALOG_ID: Es el nombre del catálogo de Hive.

    • GCS_WAREHOUSE_PATH: Es la ruta de acceso de Cloud Storage que almacena tu almacén de Hive.

  2. Envía el trabajo por lotes:

    gcloud dataproc batches submit pyspark PYTHON_SCRIPT_FILE \
        --version=2.2 \
        --project=PROJECT_ID \
        --region=REGION \
        --deps-bucket=gs://CLOUD_STORAGE_BUCKET
    

    Reemplaza lo siguiente:

    • PYTHON_SCRIPT_FILE: Es la ruta de acceso al archivo de la aplicación de PySpark. Puede ser una ruta local o la ruta del objeto de Cloud Storage.
    • PROJECT_ID: ID del proyecto
    • REGION: Es la región en la que se ejecutará el trabajo por lotes.
    • CLOUD_STORAGE_BUCKET: Es el nombre del bucket de Cloud Storage que se usa para organizar las dependencias de cualquier carga de trabajo.

Consulta la tabla desde BigQuery

Después de crear recursos desde Spark en el catálogo del entorno de ejecución de Lakehouse, puedes consultarlos desde BigQuery Studio.

  1. En la consola de Google Cloud , ve a BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    SELECT * FROM `PROJECT_ID.LAKEHOUSE_CATALOG_ID.DATABASE_NAME.TABLE_NAME`;
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto
    • LAKEHOUSE_CATALOG_ID: Es el nombre de tu catálogo de Hive.
    • DATABASE_NAME: El nombre de tu base de datos.
    • TABLE_NAME: Es el nombre de tu tabla.