使用 Lakehouse 執行階段目錄設定 Spark 和 Hive

Lakehouse 執行階段目錄可讓您使用統合的中繼資料執行 Apache Spark 和 Apache Hive 工作負載,以便直接在 BigQuery 中查詢資料表。如要管理這些工作負載,請建立 Apache Hive 目錄端點、設定 Spark 工作階段連線至 metastore,並執行 Spark 工作來產生可查詢的資料表。

事前準備

  1. 請參閱「關於 Lakehouse 執行階段目錄中的 Hive 目錄」,瞭解 Spark 如何連線至 Lakehouse 執行階段目錄。
  2. 請參閱「支援的儲存格式和資料類型」。
  3. 查看限制和注意事項。
  4. 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
  5. Verify that billing is enabled for your Google Cloud project.

  6. Enable the BigLake, Managed Service for Apache Spark APIs, if any are not already enabled.

    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

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

  8. Enable the BigLake, Managed Service for Apache Spark APIs, if any are not already enabled.

    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 目錄

如要搭配使用 Lakehouse 執行階段目錄與 Spark 和 Hive,必須先建立 Hive 目錄。

Lakehouse Hive 目錄是 Hive 資料庫的集合。執行 Spark 工作前,請先建立目錄,並向 Lakehouse 執行階段目錄註冊。目錄有名稱和 Hive 資料所在的 Cloud Storage 位置。

控制台

  1. 在 Google Cloud 控制台,開啟「Lakehouse」Lakehouse頁面。

    前往 Lakehouse

  2. 按一下「建立目錄」。

  3. 選取「Lakehouse runtime catalog」(Lakehouse 執行階段目錄)。

  4. 在「Catalog type」(目錄類型) 部分,選取「Hive Metastore」。

  5. 在「Select a Cloud Storage bucket」(選取 Cloud Storage bucket) 欄位中,輸入要與目錄搭配使用的 Cloud Storage bucket 名稱。或者,按一下「Browse」(瀏覽),選擇現有值區或建立新值區。

  6. 在「Catalog ID」(目錄 ID) 部分,為 Lakehouse Hive 目錄命名。

  7. 在「主要位置」部分,指定與 bucket 相同的區域。

  8. 點選「建立」。

gcloud

如要建立 Hive 目錄,請執行下列指令:

gcloud 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:metastore 的主要區域。如果是單一區域 bucket,則應與 bucket 區域相符。如果是雙區域或多區域 bucket,則應為其中一個組成區域,以及 metastore 主要副本的預定位置。另一個區域則會成為次要副本。

  • 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/v1/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 的主要區域。如果是單一區域 bucket,則應與 bucket 區域相符。如果是雙區域或多區域 bucket,則應為其中一個組成區域,以及 metastore 主要副本的預定位置。另一個區域則會成為次要副本。

    如要將 Hive 目錄要求直接轉送至特定區域,以符合資料落地和主權要求,可以使用區域端點 (https://biglake.LOCATION.rep.googleapis.com)。

  • DESCRIPTION:目錄說明。

設定及使用 Spark 和 Hive

如要使用 Lakehouse 執行階段目錄,您必須使用特定屬性設定 Spark 工作階段。您可以在建立 Managed Service for Apache Spark 叢集時設定這些屬性,或在每次建立工作階段時指定這些屬性。

Spark 設定屬性

使用下列屬性設定 Spark 工作階段或工作提交作業,連線至 Apache Hive 目錄端點:

屬性 值 說明
spark.hive.metastore.client.factory.class com.google.cloud.bigquery.metastore.client.BigLakeMetastoreClientFactory 設定 Spark,使用 Lakehouse 執行階段目錄 Hive 用戶端工廠。
spark.hive.metastore.blms.project.id PROJECT_ID 指定包含 Hive 目錄的 Google Cloud 專案 ID。
spark.hive.metastore.blms.catalog.default LAKEHOUSE_CATALOG_ID 指定 Lakehouse 執行階段目錄中的預設 Hive 目錄 ID。
spark.hive.metastore.warehouse.dir gs://GCS_WAREHOUSE_PATH 指定 Hive 倉儲目錄的 Cloud Storage URI。
spark.sql.catalogImplementation hive 在 Spark 工作階段中啟用 Hive 目錄支援。
spark.sql.addPartitionInBatch.size 900 選用:設定分區擷取作業的批次大小上限。詳情請參閱「分區批次大小」。
spark.sql.extensions io.delta.sql.DeltaSparkSessionExtension 選用:搭配使用 Delta 資料表和 Hive 目錄時,啟用 Delta Lake SQL 擴充功能。
spark.sql.catalog.spark_catalog org.apache.spark.sql.delta.catalog.DeltaCatalog 選用:設定 Delta 目錄實作,以便搭配 Hive 目錄使用 Delta 資料表。

更改下列內容:

  • PROJECT_ID:您的 Google Cloud 專案 ID。

  • LAKEHOUSE_CATALOG_ID:Hive 目錄名稱。

  • GCS_WAREHOUSE_PATH:儲存 Hive 倉儲的 Cloud Storage 路徑。

執行 Spark 和 Hive 查詢

建立工作階段後,您可以執行列出現有資料庫、建立資料庫、定義資料表和插入資料等作業:

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 控制台的叢集詳細資料頁面中,從「Web interfaces」(網頁介面) 分頁存取 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. 在「Explorer」窗格中,依序點選「+ ADD」和「Python notebook」。

  3. 在程式碼儲存格中,設定 Managed Service for Apache Spark 工作階段和 Lakehouse 執行階段目錄屬性:

    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. 在另一個程式碼儲存格中,建立資料庫和資料表:

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

    更改下列內容:

    • PROJECT_ID:您的 Google Cloud 專案 ID。

    • GCS_WAREHOUSE_PATH:儲存 Hive 倉儲的 Cloud Storage 路徑。

    • LAKEHOUSE_CATALOG_ID:Hive 目錄名稱。

Hive CLI

如要使用 Hive CLI,您必須設定該 CLI,以便連線至 metastore。您可以選擇以下其中一種方法:

  • 方法 1:永久設定。更新主要節點上的 /etc/hive/conf/hive-site.xml 檔案。
  • 方法 2:暫時設定。啟動 CLI 時,請提供設定旗標。

如要設定 CLI 並執行查詢工作階段,請按照下列步驟操作:

  1. 使用 SSH 連線至 Managed Service for Apache Spark 叢集的主要節點。
  2. 視設定方法而定,請執行下列其中一項操作:

    • 如要永久設定 (選項 1):

      1. 在主要節點上開啟 /etc/hive/conf/hive-site.xml,並新增下列屬性:

        <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. 啟動 Hive CLI:

        hive
        
    • 如要在啟動時暫時設定 (選項 2):使用設定旗標啟動 Hive CLI:

      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. 接著,在 Hive CLI 工作階段中執行下列指令:

    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;
    

    更改下列內容:

    • PROJECT_ID:您的 Google Cloud 專案 ID。

    • LAKEHOUSE_CATALOG_ID:Hive 目錄名稱。

    • GCS_WAREHOUSE_PATH:儲存 Hive 倉儲的 Cloud Storage 路徑。

提交 Managed Service for Apache Spark 批次工作

您可以將 PySpark 批次工作負載提交至 Managed Service for Apache Spark,該服務會使用 Lakehouse 執行階段目錄。

這個 PySpark 程式碼片段會初始化 Spark 工作階段,並設定為連線至 Lakehouse 執行階段目錄。設定 Lakehouse 用戶端工廠、 Google Cloud 專案 ID、預設目錄和倉儲目錄等重要屬性。建立工作階段後,程式碼會示範如何使用 Spark SQL 指令,列出現有資料庫、建立新資料庫,以及在該資料庫中定義 Parquet 格式的資料表。

  1. 建立含有 PySpark 工作的 Python 檔案:

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

    更改下列內容:

    • PROJECT_ID:您的 Google Cloud 專案 ID。

    • LAKEHOUSE_CATALOG_ID:Hive 目錄名稱。

    • GCS_WAREHOUSE_PATH:儲存 Hive 倉儲的 Cloud Storage 路徑。

  2. 提交批次工作:

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

    更改下列內容:

    • PYTHON_SCRIPT_FILE:PySpark 應用程式檔案的路徑。可以是本機路徑或 Cloud Storage 物件路徑。
    • PROJECT_ID:專案 ID。
    • REGION:執行批次工作的區域。
    • CLOUD_STORAGE_BUCKET:Cloud Storage bucket 的名稱,用於暫存任何工作負載的依附元件。

透過 BigQuery 查詢資料表

在 Lakehouse 執行階段目錄中,透過 Spark 建立資源後,即可在 BigQuery Studio 查詢這些資源。

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中輸入下列陳述式:

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

    更改下列內容:

    • PROJECT_ID:您的專案 ID。
    • LAKEHOUSE_CATALOG_ID:Hive 目錄名稱。
    • DATABASE_NAME:資料庫名稱。
    • TABLE_NAME:資料表名稱。