使用 Lakehouse 运行时目录设置 Spark 和 Hive

本文档介绍了如何设置和配置 Apache Spark 和 Apache Hive 以使用 Lakehouse 运行时目录。您将了解如何创建 Apache Hive 目录、配置 Spark 会话以连接到 metastore,以及运行工作负载以创建可以直接在 BigQuery 中查询的表。

准备工作

  1. 请参阅关于 Lakehouse 运行时目录中的 Hive 目录,了解 Spark 如何连接到 Lakehouse 运行时目录。
  2. 查看支持的存储格式和数据类型
  3. 查看限制和注意事项
  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the Lakehouse, Managed Service for Apache Spark APIs.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

所需的角色

如需获得使用 Lakehouse 运行时目录所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如需查看相关说明,请参阅授予单个角色

常规工作流程

如需将 Lakehouse 运行时目录与 Spark 和 Hive 搭配使用,请按照以下常规工作流程操作:

  1. 创建 Lakehouse Hive 目录。
  2. 使用您偏好的工具(例如 Managed Service for Apache Spark 或 BigQuery Studio)配置 Spark 会话。
  3. 在 Spark 会话中执行数据库和表操作。
  4. 向 Managed Service for Apache Spark 提交批量工作负载,并直接从 BigQuery 查询生成的表。

创建 Lakehouse Hive catalog

如需将 Lakehouse 运行时目录与 Spark 和 Hive 搭配使用,您必须先创建 Hive 目录。

Lakehouse Hive 目录是一组 Hive 数据库。在运行 Spark 作业之前,请创建一个目录,以便将其注册到 Lakehouse Metastore。目录具有名称和 Cloud Storage 位置(Hive 数据所在的位置)。

控制台

  1. 在 Google Cloud 控制台中,打开 Lakehouse 页面。

    前往 Lakehouse

  2. 点击创建目录

  3. 选择 Lakehouse 运行时目录

  4. 对于目录类型,选择 Hive Metastore

  5. 选择 Cloud Storage 存储桶字段中,输入要与目录搭配使用的 Cloud Storage 存储桶的名称。或者,点击浏览以选择现有存储桶或创建新存储桶。

  6. 目录 ID 中,为您的 Lakehouse Hive 目录命名。

  7. 对于主要位置,请指定与您的存储桶相同的区域。

  8. 点击创建

gcloud

如需创建 Hive 目录,请运行以下命令:

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

替换以下内容:

  • LAKEHOUSE_CATALOG_ID:Hive 目录名称。

  • GCS_WAREHOUSE_PATH:用于存储 Hive 数据仓库的 Cloud Storage 路径。

  • PROJECT_ID: Google Cloud项目 ID。

  • REGION:元存储区的主区域。对于单区域存储桶,它应与存储桶区域一致。对于双区域或多区域存储分区,它应该是组成区域之一,并且是元存储区的主副本的预期位置。另一个区域将成为次要副本。

  • DESCRIPTION:目录的说明。

curl

  1. 如需创建 Hive 目录,请运行以下命令:
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/v1beta/projects/PROJECT_ID/catalogs?hiveCatalogId=LAKEHOUSE_CATALOG_ID&primary_location=REGION"

替换以下内容:

  • LAKEHOUSE_CATALOG_ID:Hive 目录名称。

  • GCS_WAREHOUSE_PATH:用于存储 Hive 数据仓库的 Cloud Storage 路径。

  • PROJECT_ID:您的 Google Cloud 项目 ID。

  • REGION:Metastore 的主要区域。对于单区域存储桶,它应与存储桶区域一致。对于双区域或多区域存储分区,它应该是组成区域之一,并且是元存储区主副本的预期位置。另一个区域将成为辅助副本。

  • DESCRIPTION:目录的说明。

配置和使用 Spark 及 Hive

如需使用 Lakehouse 运行时目录,您必须使用特定属性配置 Spark 会话。您可以在创建 Managed Service for Apache Spark 集群时设置这些属性,也可以在每次创建会话时指定这些属性。

这些属性包括客户端工厂、 Google Cloud项目 ID、默认目录和仓库目录等详细信息。会话建立后,您可以执行基本操作,例如列出现有数据库、创建新数据库、定义表和插入数据。

spark-sql

  1. 使用 SSH 连接到 Managed Service for Apache Spark 集群的主节点
  2. 在命令行上运行 spark-sql 并使用以下属性来启动交互式 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. 会话开始后,Spark 会连接到 Lakehouse 运行时目录。

    运行以下命令以创建和查询资源:

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

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。

    • LAKEHOUSE_CATALOG_ID:Hive 目录名称。

    • GCS_WAREHOUSE_PATH:用于存储 Hive 数据仓库的 Cloud Storage 路径。

Jupyter 笔记本

  1. 按照说明在 Managed Service for Apache Spark 集群上运行 Jupyter 笔记本
  2. 在 Google Cloud 控制台的集群详情页面中,通过网页界面标签页访问 Jupyter 网页界面。
  3. 在新的笔记本中,创建 Spark 会话,然后运行以下查询:

    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()
    

    替换以下内容:

    • PROJECT_ID:您的 Google Cloud 项目 ID。

    • GCS_WAREHOUSE_PATH:用于存储 Hive 数据仓库的 Cloud Storage 路径。

    • LAKEHOUSE_CATALOG_ID:Hive 目录名称。

BigQuery 笔记本

  1. 在 Google Cloud 控制台中,前往 BigQuery

    转到 BigQuery

  2. 探索器窗格中,点击 + 添加,然后点击 Python 笔记本

  3. 在代码单元格中,配置 Managed Service for Apache Spark 会话和 Lakehouse 运行时目录属性:

    from google.cloud.dataproc_spark_connect import DataprocSparkSession
    from google.cloud.dataproc_v1 import Session