Lakehouse 執行階段目錄可讓您使用統合的中繼資料執行 Apache Spark 和 Apache Hive 工作負載,以便直接在 BigQuery 中查詢資料表。如要管理這些工作負載,請建立 Apache Hive 目錄端點、設定 Spark 工作階段連線至 metastore,並執行 Spark 工作來產生可查詢的資料表。
事前準備
- 請參閱「關於 Lakehouse 執行階段目錄中的 Hive 目錄」,瞭解 Spark 如何連線至 Lakehouse 執行階段目錄。
- 請參閱「支援的儲存格式和資料類型」。
- 查看限制和注意事項。
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
Verify that billing is enabled for your Google Cloud project.
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.enablepermission. 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.-
Verify that billing is enabled for your Google Cloud project.
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.enablepermission. 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.
必要的角色
如要取得使用 Lakehouse 執行階段目錄所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
-
建立 Managed Service for Apache Spark 叢集:Dataproc 編輯器 (
roles/dataproc.editor) -
叢集服務帳戶:
- Dataproc worker (
roles/dataproc.worker) - Storage 物件使用者 (
roles/storage.objectUser) - BigLake 編輯者 (
roles/biglake.editor) - 服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer)
- Dataproc worker (
-
所有 Lakehouse 執行階段目錄資源的寫入權限:BigLake 編輯者 (
roles/biglake.editor) -
所有 Lakehouse 執行階段目錄資源的唯讀存取權:BigLake 檢視者 (
roles/biglake.viewer)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
如需操作說明,請參閱「授予單一角色」。
一般工作流程
如要搭配使用 Lakehouse 執行階段目錄與 Spark 和 Hive,請按照下列一般工作流程操作:
- 建立 Lakehouse Hive 目錄端點。
- 使用偏好的工具 (例如 Managed Service for Apache Spark 或 BigQuery Studio) 設定 Spark 工作階段。
- 在 Spark 工作階段中執行資料庫和資料表作業。
- 將批次工作負載提交至 Managed Service for Apache Spark,並直接從 BigQuery 查詢產生的資料表。
建立 Lakehouse Hive 目錄
如要搭配使用 Lakehouse 執行階段目錄與 Spark 和 Hive,必須先建立 Hive 目錄。
Lakehouse Hive 目錄是 Hive 資料庫的集合。執行 Spark 工作前,請先建立目錄,並向 Lakehouse 執行階段目錄註冊。目錄有名稱和 Hive 資料所在的 Cloud Storage 位置。
控制台
在 Google Cloud 控制台,開啟「Lakehouse」Lakehouse頁面。
按一下「建立目錄」。
選取「Lakehouse runtime catalog」(Lakehouse 執行階段目錄)。
在「Catalog type」(目錄類型) 部分,選取「Hive Metastore」。
在「Select a Cloud Storage bucket」(選取 Cloud Storage bucket) 欄位中,輸入要與目錄搭配使用的 Cloud Storage bucket 名稱。或者,按一下「Browse」(瀏覽),選擇現有值區或建立新值區。
在「Catalog ID」(目錄 ID) 部分,為 Lakehouse Hive 目錄命名。
在「主要位置」部分,指定與 bucket 相同的區域。
點選「建立」。
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
- 如要建立 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
- 使用 SSH 連線至 Managed Service for Apache Spark 叢集的主要節點。
在指令列中執行
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工作階段開始後,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 筆記本
- 按照操作說明,在 Managed Service for Apache Spark 叢集上執行 Jupyter 筆記本。
- 在 Google Cloud 控制台的叢集詳細資料頁面中,從「Web interfaces」(網頁介面) 分頁存取 Jupyter 網頁介面。
在新筆記本中建立 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 筆記本
前往 Google Cloud 控制台的「BigQuery」頁面。
在「Explorer」窗格中,依序點選「+ ADD」和「Python notebook」。
在程式碼儲存格中,設定 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")在另一個程式碼儲存格中,建立資料庫和資料表:
# 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 並執行查詢工作階段,請按照下列步驟操作:
- 使用 SSH 連線至 Managed Service for Apache Spark 叢集的主要節點。
視設定方法而定,請執行下列其中一項操作:
如要永久設定 (選項 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>啟動 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"
接著,在 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 格式的資料表。
建立含有 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 路徑。
提交批次工作:
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 查詢這些資源。
前往 Google Cloud 控制台的「BigQuery」頁面。
在查詢編輯器中輸入下列陳述式:
SELECT * FROM `PROJECT_ID.LAKEHOUSE_CATALOG_ID.DATABASE_NAME.TABLE_NAME`;更改下列內容:
PROJECT_ID:您的專案 ID。LAKEHOUSE_CATALOG_ID:Hive 目錄名稱。DATABASE_NAME:資料庫名稱。TABLE_NAME:資料表名稱。