使用 Google Cloud CLI 在 Lakehouse 建立及查詢 Iceberg 資料表
Borderless Lakehouse 可讓您在Google Cloud 和 Apache Spark、Trino、Apache Flink 等開放原始碼引擎之間共用 Apache Iceberg 資料表。Lakehouse 執行階段目錄會透過 Apache Iceberg REST 目錄端點,追蹤中繼資料,包括結構定義、快照和 Cloud Storage 位置。
在本快速入門導覽課程中,您將使用 Google Cloud CLI 設定多 bucket 目錄,並在 Managed Service for Apache Spark 執行 PySpark 工作。工作建立 Iceberg 資料表後,您可以使用 4 部分的 P.C.N.T (Project.Catalog.Namespace.Table) 語法,直接在 BigQuery 中查詢資料表,不必移動或註冊資料。
事前準備
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用 BigLake、Managed Service for Apache Spark、Cloud Storage、BigQuery 和 Compute Engine API (如有尚未啟用的 API):
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable biglake.googleapis.com
dataproc.googleapis.com storage.googleapis.com bigquery.googleapis.com compute.googleapis.com -
將角色授予使用者帳戶。針對下列各個 IAM 角色執行下列指令一次:
roles/biglake.admin, roles/storage.admin, roles/dataproc.editor, roles/resourcemanager.projectIamAdmin, roles/bigquery.jobUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
-
建立專案:如要建立專案,您必須具備專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為您要建立的 Google Cloud 專案名稱。 -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
啟用 BigLake、Managed Service for Apache Spark、Cloud Storage、BigQuery 和 Compute Engine API (如有尚未啟用的 API):
啟用 API 所需的角色
您必須具備
serviceusage.services.enable權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「Service Usage 管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。gcloud services enable biglake.googleapis.com
dataproc.googleapis.com storage.googleapis.com bigquery.googleapis.com compute.googleapis.com -
將角色授予使用者帳戶。針對下列各個 IAM 角色執行下列指令一次:
roles/biglake.admin, roles/storage.admin, roles/dataproc.editor, roles/resourcemanager.projectIamAdmin, roles/bigquery.jobUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
更改下列內容:
PROJECT_ID:專案 ID。USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com。ROLE:授予使用者帳戶的 IAM 角色。
設定環境並建立 bucket
開啟 Cloud Shell 並建立 Cloud Storage bucket,用於存放 PySpark 指令碼和 Iceberg 資料表資料:
在 Google Cloud 控制台,點選「啟用 Cloud Shell」。
如果出現提示訊息,請按一下「授權」。
為專案、區域、bucket 和目錄名稱設定環境變數,以便在本快速入門導覽課程中重複使用:
export PROJECT_ID=$(gcloud config get-value project) export REGION="us-central1" export BUCKET_NAME="${PROJECT_ID}-lakehouse-quickstart" export LAKEHOUSE_CATALOG_ID="quickstart_catalog"在所選區域建立 Cloud Storage bucket:
gcloud storage buckets create gs://${BUCKET_NAME} \ --project=${PROJECT_ID} \ --location=${REGION}
將權限授予 Spark 服務帳戶
根據預設,Managed Service for Apache Spark 會使用專案的 Compute Engine 預設服務帳戶執行批次工作。向這個服務帳戶授予下列 IAM 角色,以便從 Cloud Storage 讀取 PySpark 指令碼,並與 Lakehouse 執行階段目錄和 BigQuery 互動:
| 角色 | 資源 | 目的 |
|---|---|---|
| Dataproc worker ( roles/dataproc.worker) |
專案 | 執行 Managed Service for Apache Spark 批次工作負載。 |
| 服務使用情形消費者 ( roles/serviceusage.serviceUsageConsumer) |
專案 | 使用專案 API 和配額。 |
| BigLake 編輯者 ( roles/biglake.editor) |
專案 | 建立目錄資源,並要求供應商提供的儲存空間憑證。 |
| BigQuery 資料編輯者 ( roles/bigquery.dataEditor) |
專案 | 管理資料表的 BigQuery 中繼資料。 |
| Storage 物件檢視者 ( roles/storage.objectViewer) |
值區 | 從 Cloud Storage bucket 讀取 PySpark 指令碼。 |
請注意,Spark 服務帳戶只需要 Storage 物件檢視者角色 (roles/storage.objectViewer),即可讀取 PySpark 指令碼。工作執行時,Lakehouse 執行階段目錄會提供資料表範圍的臨時寫入憑證,因此不需要值區的直接寫入權限。
在 Cloud Shell 執行下列指令碼,授予這些角色:
PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} \
--format='value(projectNumber)')
SPARK_SA="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"
for ROLE in \
"roles/dataproc.worker" \
"roles/serviceusage.serviceUsageConsumer" \
"roles/biglake.editor" \
"roles/bigquery.dataEditor"; do
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="serviceAccount:${SPARK_SA}" \
--role="${ROLE}"
done
gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
--member="serviceAccount:${SPARK_SA}" \
--role="roles/storage.objectViewer"在 Lakehouse 執行階段目錄中建立目錄
在 Lakehouse 執行階段目錄中,為 Apache Iceberg 資料表建立目錄。
在 Cloud Shell 中建立多值區目錄。多 bucket 目錄可讓您獨立命名目錄,不受任何 bucket 名稱影響,並將多個 Cloud Storage bucket 與單一目錄建立關聯。啟用憑證臨時配發模式,讓 Lakehouse 執行階段目錄能代表您,安全地向 Spark 核發臨時儲存空間憑證。
gcloud biglake iceberg catalogs create ${LAKEHOUSE_CATALOG_ID} \ --project=${PROJECT_ID} \ --catalog-type=biglake \ --default-location=gs://${BUCKET_NAME} \ --credential-mode=vended-credentials
授予目錄值區存取權:
使用憑證販售功能時,目錄的自動佈建服務帳戶需要 bucket 的 Storage 物件使用者角色 (
roles/storage.objectUser),才能為用戶端引擎產生臨時存取權杖。# Retrieve the auto-provisioned catalog service account email CATALOG_SA=$(gcloud biglake iceberg catalogs describe ${LAKEHOUSE_CATALOG_ID} \ --project=${PROJECT_ID} \ --format='value(biglake-service-account)') # Grant the Storage Object User role to the catalog service account on your bucket gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \ --member="serviceAccount:${CATALOG_SA}" \ --role="roles/storage.objectUser"
使用 PySpark 工作建立 Iceberg 資料表
目錄和權限準備就緒後,您可以在 Managed Service for Apache Spark 執行 PySpark 工作,建立 Iceberg 資料表並插入一些樣本資料。
建立及上傳 PySpark 指令碼
在 Cloud Shell 建立名為
quickstart.py的檔案:cat << 'EOF' > quickstart.py from pyspark.sql import SparkSession spark = SparkSession.builder.appName("quickstart").getOrCreate() # Create a namespace spark.sql("CREATE NAMESPACE IF NOT EXISTS `quickstart_catalog`.quickstart_namespace") # Create the table spark.sql(""" CREATE OR REPLACE TABLE `quickstart_catalog`.quickstart_namespace.quickstart_table ( id INT, name STRING ) USING iceberg """) # Insert data into the table spark.sql(""" INSERT INTO `quickstart_catalog`.quickstart_namespace.quickstart_table VALUES (1, 'one'), (2, 'two'), (3, 'three') """) EOF這個指令碼會啟動 Spark 工作階段、建立名為
quickstart_namespace的命名空間和名為quickstart_table的 Iceberg 資料表,並插入三列樣本資料。由於 SQL 陳述式未指定 bucket 路徑 (LOCATION),Lakehouse 執行階段目錄會自動將命名空間和資料表檔案儲存在目錄的--default-locationbucket (gs://${BUCKET_NAME}) 中。將
quickstart.py複製到 Cloud Storage bucket,讓 Managed Service for Apache Spark 存取:gcloud storage cp quickstart.py gs://${BUCKET_NAME}/quickstart.py
執行 PySpark 指令碼
將 PySpark 指令碼提交為 Managed Service for Apache Spark 批次工作,使用預先安裝的 Iceberg 程式庫執行程式碼,不需佈建叢集。
--properties 旗標會設定 Spark,使用 Apache Iceberg REST 目錄端點,連線至 Lakehouse 執行階段目錄中的目錄:
在 Cloud Shell 提交批次工作:
gcloud dataproc batches submit pyspark gs://${BUCKET_NAME}/quickstart.py \ --project=${PROJECT_ID} \ --region=${REGION} \ --version=2.2 \ --properties="spark.sql.catalog.quickstart_catalog=org.apache.iceberg.spark.SparkCatalog,\ spark.sql.catalog.quickstart_catalog.type=rest,\ spark.sql.catalog.quickstart_catalog.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog,\ spark.sql.catalog.quickstart_catalog.warehouse=bl://projects/${PROJECT_ID}/catalogs/${LAKEHOUSE_CATALOG_ID},\ spark.sql.catalog.quickstart_catalog.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO,\ spark.sql.catalog.quickstart_catalog.header.x-goog-user-project=${PROJECT_ID},\ spark.sql.catalog.quickstart_catalog.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\ spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,\ spark.sql.catalog.quickstart_catalog.header.X-Iceberg-Access-Delegation=vended-credentials,\ spark.sql.catalog.quickstart_catalog.gcs.oauth2.refresh-credentials-endpoint=https://oauth2.googleapis.com/token"
除了標準 Iceberg 設定 (
SparkCatalog、type=rest和IcebergSparkSessionExtensions) 之外,這些屬性也會設定 Lakehouse 執行階段目錄連線:uri和warehouse(bl://...):將 Spark 連線至 Lakehouse 執行階段目錄 Apache Iceberg REST 目錄端點,並將要求轉送至多個 bucket 目錄。rest.auth.type和header.x-goog-user-project:使用 Spark 服務帳戶的憑證驗證 REST 要求,並向專案收取 API 配額費用。header.X-Iceberg-Access-Delegation、io-impl和gcs.oauth2.refresh-credentials-endpoint:向目錄要求臨時提供的 Cloud Storage 憑證,並設定 Iceberg 的GCSFileIO用戶端,使用這些權杖寫入資料檔案。
如要進一步瞭解這些設定,請參閱「設定用戶端應用程式」和 Apache Iceberg Spark 設定說明文件。
工作完成後,輸出內容大致如下:
Batch [cb9d84e9489d408baca4f9e7ab4c64ff] finished. metadata: '@type': type.googleapis.com/google.cloud.dataproc.v1.BatchOperationMetadata batch: projects/PROJECT_ID/locations/us-central1/batches/cb9d84e9489d408baca4f9e7ab4c64ff batchUuid: 54b0b9d2-f0a1-4fdf-ae44-eead3f8e60e9 createTime: '2026-01-24T00:10:50.224097Z' description: Batch labels: goog-dataproc-batch-id: cb9d84e9489d408baca4f9e7ab4c64ff goog-dataproc-batch-uuid: 54b0b9d2-f0a1-4fdf-ae44-eead3f8e60e9 goog-dataproc-drz-resource-uuid: batch-54b0b9d2-f0a1-4fdf-ae44-eead3f8e60e9 goog-dataproc-location: us-central1 operationType: BATCH name: projects/PROJECT_ID/regions/us-central1/operations/32287926-5f61-3572-b54a-fbad8940d6ef
透過 BigQuery 查詢資料表
Spark 寫入 Iceberg 資料表後,您就能立即在 BigQuery 中使用 4 部分的 P.C.N.T (Project.Catalog.Namespace.Table) 語法查詢資料表:
在 Cloud Shell 執行下列
bq query指令:bq query --project_id=${PROJECT_ID} --location=${REGION} --use_legacy_sql=false \ "SELECT * FROM \`${PROJECT_ID}.${LAKEHOUSE_CATALOG_ID}.quickstart_namespace.quickstart_table\`"輸出內容會顯示您透過 PySpark 工作插入的三個資料列:
+----+-------+ | id | name | +----+-------+ | 1 | one | | 2 | two | | 3 | three | +----+-------+
由於 Lakehouse 執行階段目錄會追蹤 Iceberg 中繼資料並處理儲存空間存取權,因此 Spark 提交快照後,BigQuery 就會立即讀取 Cloud Storage 中的基礎檔案。
此時,您也可以使用任何其他與 Iceberg 相容的引擎 (例如 Trino、Flink 或自行管理的 Spark 叢集),讀取或寫入 quickstart_table。由於目錄已啟用憑證販售功能,外部引擎只需要專案的 BigLake 檢視者角色 (roles/biglake.viewer) 即可讀取資料表,或需要 BigLake 編輯者角色 (roles/biglake.editor) 才能寫入資料及提交新快照。如要瞭解如何連結其他引擎,請參閱「設定 Apache Iceberg REST 目錄端點」。
清除所用資源
為避免 Google Cloud 帳戶產生不必要的費用,請刪除您在本快速入門導覽課程中建立的資源。刪除資料表、命名空間和目錄,會從 Lakehouse 執行階段目錄中移除中繼資料註冊,而刪除 bucket 則會移除儲存在 Cloud Storage 中的基礎 Parquet 資料和 Iceberg 中繼資料檔案:
在 Cloud Shell 中,從目錄刪除資料表:
gcloud biglake iceberg tables delete quickstart_table \ --project=${PROJECT_ID} \ --catalog=${LAKEHOUSE_CATALOG_ID} \ --namespace=quickstart_namespace \ --quiet從目錄中刪除命名空間:
gcloud biglake iceberg namespaces delete quickstart_namespace \ --project=${PROJECT_ID} \ --catalog=${LAKEHOUSE_CATALOG_ID} \ --quiet刪除目錄:
gcloud biglake iceberg catalogs delete ${LAKEHOUSE_CATALOG_ID} \ --project=${PROJECT_ID} --quiet刪除 Cloud Storage bucket 和所有內容:
gcloud storage rm -r gs://${BUCKET_NAME}
後續步驟
- 請嘗試使用 Google Cloud 控制台建立及查詢 Iceberg 資料表快速入門導覽課程,在使用者介面中建立命名空間和 Iceberg 資料表,並使用 BigQuery data manipulation language (DML) 修改資料。
- 試用設定跨雲端資料存取權程式碼實驗室,在 Amazon Web Services (AWS)、AlloyDB for PostgreSQL 和 Cloud Storage 之間查詢資料,不需執行 ETL。
- 瞭解多 bucket 目錄和 Apache Iceberg REST 目錄端點。
- 瞭解如何在 Lakehouse 執行階段目錄中管理目錄。
- 瞭解 Lakehouse 代管的 Apache Iceberg 資料表。