本文說明如何設定及配置 Apache Spark 和 Apache Hive,以使用 Lakehouse 執行階段目錄。您將瞭解如何建立 Apache Hive 目錄、設定 Spark 工作階段以連線至中繼存放區,以及執行工作負載來建立資料表,以便直接在 BigQuery 中查詢。
事前準備
- 請參閱「關於 Lakehouse 執行階段目錄中的 Hive 目錄」,瞭解 Spark 如何連線至 Lakehouse 執行階段目錄。
- 請參閱「支援的儲存格式和資料類型」。
- 查看限制和注意事項。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. 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,請按照下列一般工作流程操作:
- 建立 Apache Iceberg Hive 目錄專用的 Lakehouse。
- 使用偏好的工具 (例如 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 Metastore 註冊。目錄有名稱和 Cloud Storage 位置,其中存放 Hive 資料。
控制台
在 Google Cloud 控制台中開啟「Lakehouse」Lakehouse頁面。
按一下「建立目錄」。
選取「Lakehouse 執行階段目錄」。
在「目錄類型」部分,選取「Hive Metastore」。
在「選取 Cloud Storage bucket」欄位中,輸入要與目錄搭配使用的 Cloud Storage bucket 名稱。或者,按一下「瀏覽」,選擇現有 bucket 或建立新 bucket。
在「目錄 ID」中,為 Lakehouse Hive 目錄命名。
在「Primary location」(主要位置) 中,指定與值區相同的區域。
點選「建立」。
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:中繼資料存放區的主要區域。如果是單一區域值區,應與值區區域相符。如果是雙區域或多區域值區,應為其中一個組成區域,也是中繼資料存放區主要副本的預定位置。另一個區域則會成為次要副本。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:中繼資料存放區的主要區域。如果是單一區域值區,這應與值區區域相符。如果是雙區域或多區域值區,這應是其中一個組成區域,也是中繼資料存放區主要副本的預定位置。另一個區域則會成為次要副本。DESCRIPTION:目錄說明。
設定及使用 Spark 和 Hive
如要使用 Lakehouse 執行階段目錄,您必須使用特定屬性設定 Spark 工作階段。您可以在建立 Managed Service for Apache Spark 叢集時設定這些屬性,也可以在每次建立工作階段時指定這些屬性。
這些屬性包括用戶端工廠、 Google Cloud專案 ID、預設目錄和倉庫目錄等詳細資料。建立工作階段後,您就可以執行基本作業,例如列出現有資料庫、建立新資料庫、定義資料表及插入資料。
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 控制台的叢集詳細資料頁面中,透過「網路介面」分頁存取 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」頁面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,必須設定連線至 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 批次工作負載提交至使用 Lakehouse 執行階段目錄的 Managed Service for Apache Spark。
這段 PySpark 程式碼片段會初始化 Spark 工作階段,並設定連線至 Lakehouse 執行階段目錄。它會設定 Lakehouse 用戶端 Factory、 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:資料表名稱。