本文說明如何使用 Dataproc Jobs 服務、Spark SQL CLI 或在 Dataproc 叢集上執行的 Zeppelin 網頁介面,在 BigLake 中繼存放區建立含有中繼資料的 Apache Iceberg 資料表。
事前準備
請建立 Google Cloud 專案、Cloud Storage bucket 和 Dataproc 叢集。
設定專案
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Dataproc, BigQuery, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Dataproc, BigQuery, and Cloud Storage APIs.
-
Install the Google Cloud CLI.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init
在專案中建立 Cloud Storage bucket。
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
-
In the Get started section, do the following:
- Enter a globally unique name that meets the bucket naming requirements.
- To add a
bucket label,
expand the Labels section ( ),
click add_box
Add label, and specify a
key
and avalue
for your label.
-
In the Choose where to store your data section, do the following:
- Select a Location type.
- Choose a location where your bucket's data is permanently stored from the Location type drop-down menu.
- If you select the dual-region location type, you can also choose to enable turbo replication by using the relevant checkbox.
- To set up cross-bucket replication, select
Add cross-bucket replication via Storage Transfer Service and
follow these steps:
Set up cross-bucket replication
- In the Bucket menu, select a bucket.
In the Replication settings section, click Configure to configure settings for the replication job.
The Configure cross-bucket replication pane appears.
- To filter objects to replicate by object name prefix, enter a prefix that you want to include or exclude objects from, then click Add a prefix.
- To set a storage class for the replicated objects, select a storage class from the Storage class menu. If you skip this step, the replicated objects will use the destination bucket's storage class by default.
- Click Done.
-
In the Choose how to store your data section, do the following:
- Select a default storage class for the bucket or Autoclass for automatic storage class management of your bucket's data.
- To enable hierarchical namespace, in the Optimize storage for data-intensive workloads section, select Enable hierarchical namespace on this bucket.
- In the Choose how to control access to objects section, select whether or not your bucket enforces public access prevention, and select an access control method for your bucket's objects.
-
In the Choose how to protect object data section, do the
following:
- Select any of the options under Data protection that you
want to set for your bucket.
- To enable soft delete, click the Soft delete policy (For data recovery) checkbox, and specify the number of days you want to retain objects after deletion.
- To set Object Versioning, click the Object versioning (For version control) checkbox, and specify the maximum number of versions per object and the number of days after which the noncurrent versions expire.
- To enable the retention policy on objects and buckets, click the Retention (For compliance) checkbox, and then do the following:
- To enable Object Retention Lock, click the Enable object retention checkbox.
- To enable Bucket Lock, click the Set bucket retention policy checkbox, and choose a unit of time and a length of time for your retention period.
- To choose how your object data will be encrypted, expand the Data encryption section (Data encryption method. ), and select a
- Select any of the options under Data protection that you
want to set for your bucket.
-
In the Get started section, do the following:
- Click Create.
建立 Dataproc 叢集。 如要節省資源和成本,可以建立單一節點 Dataproc 叢集,執行本文中的範例。
在建立叢集的區域中,子網路必須啟用私人 Google 存取權 (PGA)。
如要執行本指南中的 Zeppelin 網頁介面範例,請務必使用或建立已啟用 Zeppelin 選用元件的 Dataproc 叢集。
將角色授予自訂服務帳戶 (如有需要):根據預設,Dataproc 叢集 VM 會使用預設的 Compute Engine 服務帳戶與 Dataproc 互動。如要在建立叢集時指定自訂服務帳戶,該帳戶必須具有 Dataproc Worker 角色 (
roles/dataproc.worker
),或是具備必要 Worker 角色權限的自訂角色。在本地終端機視窗或 Cloud Shell 中,使用
vi
或nano
等文字編輯器,將下列指令複製到iceberg-table.sql
檔案中,然後將檔案儲存到目前目錄。USE CATALOG_NAME; CREATE NAMESPACE IF NOT EXISTS example_namespace; USE example_namespace; DROP TABLE IF EXISTS example_table; CREATE TABLE example_table (id int, data string) USING ICEBERG LOCATION 'gs://BUCKET/WAREHOUSE_FOLDER'; INSERT INTO example_table VALUES (1, 'first row'); ALTER TABLE example_table ADD COLUMNS (newDoubleCol double); DESCRIBE TABLE example_table;
更改下列內容:
- CATALOG_NAME:Iceberg 目錄名稱。
- BUCKET 和 WAREHOUSE_FOLDER:用於 Iceberg 倉庫的 Cloud Storage 值區和資料夾。
使用 gcloud CLI 將本機
iceberg-table.sql
複製到 Cloud Storage 中的 bucket。gcloud storage cp iceberg-table.sql gs://BUCKET/
在本地終端機視窗或 Cloud Shell 中,執行下列
curl
指令,將iceberg-spark-runtime-3.5_2.12-1.6.1
JAR 檔案下載至目前目錄。curl -o iceberg-spark-runtime-3.5_2.12-1.6.1.jar https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar
使用 gcloud CLI,將目前目錄中的本機
iceberg-spark-runtime-3.5_2.12-1.6.1
JAR 檔案複製到 Cloud Storage 中的值區。gcloud storage cp iceberg-spark-runtime-3.5_2.12-1.6.1.jar gs://BUCKET/
在本機終端機視窗或 Cloud Shell 中執行下列 gcloud dataproc jobs submit spark-sql 指令,將 Spark SQL 工作提交至叢集,以建立 Iceberg 資料表。
gcloud dataproc jobs submit spark-sql \ --project=PROJECT_ID \ --cluster=CLUSTER_NAME \ --region=REGION \ --jars="gs://BUCKET/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.1-beta.jar" \ --properties="spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog,spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID,spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION,spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/WAREHOUSE_FOLDER" \ -f="gs://BUCKETiceberg-table.sql"
注意:
- PROJECT_ID:您的 Google Cloud 專案 ID。 專案 ID 會列在 Google Cloud 控制台資訊主頁的「專案資訊」部分。
- CLUSTER_NAME:Dataproc 叢集名稱。
- REGION:叢集所在的 Compute Engine 地區。
- CATALOG_NAME:Iceberg 目錄名稱。
- BUCKET 和 WAREHOUSE_FOLDER:用於 Iceberg 倉庫的 Cloud Storage 值區和資料夾。
- LOCATION:支援的 BigQuery 位置。預設位置為「美國」。
--jars
:列出的 JAR 必須在 BigLake Metastore 中建立資料表的中繼資料。--properties
:目錄屬性。-f
:您複製到 Cloud Storage 值區的iceberg-table.sql
工作檔案。
工作完成後,即可在終端機輸出內容中查看資料表說明。
Time taken: 2.194 seconds id int data string newDoubleCol double Time taken: 1.479 seconds, Fetched 3 row(s) Job JOB_ID finished successfully.
如要在 BigQuery 中查看資料表的中繼資料
前往 Google Cloud 控制台的「BigQuery」頁面。
查看 Iceberg 資料表中繼資料。
前往 Google Cloud 控制台的 Dataproc「Submit a job」(提交工作)。
前往「Submit a job」(提交工作) 頁面,然後填寫下列欄位:
- 工作 ID:接受系統建議的 ID,或插入您自己的 ID。
- 地區:選取叢集所在的地區。
- 叢集:選取叢集。
- 工作類型:選取
SparkSql
。 - 查詢來源類型:選取
Query file
。 - 查詢檔案:插入
gs://BUCKET/iceberg-table.sql
- Jar 檔案:插入下列內容:
gs://BUCKET/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.1-beta.jar
- 屬性:按一下「新增屬性」
key
value
輸入欄位的清單,然後複製下列「鍵」和「值」配對,定義五個屬性。# 鍵 值 1. spark.sql.catalog.CATALOG_NAME
org.apache.iceberg.spark.SparkCatalog
2. spark.sql.catalog.CATALOG_NAME.catalog-impl
org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog
3. spark.sql.catalog.CATALOG_NAME.gcp_project
PROJECT_ID
4. spark.sql.catalog.CATALOG_NAME.gcp_location
LOCATION
5. spark.sql.catalog.CATALOG_NAME.warehouse
gs://BUCKET/WAREHOUSE_FOLDER
五次,建立五個
注意:
- CATALOG_NAME:Iceberg 目錄名稱。
- PROJECT_ID:您的 Google Cloud 專案 ID。 專案 ID 會列在 Google Cloud 控制台資訊主頁的「專案資訊」部分。 叢集所在的區域。
- LOCATION:支援的 BigQuery 位置。預設位置為「美國」。
- BUCKET 和 WAREHOUSE_FOLDER:用於 Iceberg 倉庫的 Cloud Storage 值區和資料夾。
按一下「提交」。
如要監控工作進度及查看工作輸出內容,請前往 Google Cloud 控制台的 Dataproc「Jobs」(工作) 頁面,然後按一下
Job ID
開啟「Job details」(工作詳細資料) 頁面。如要在 BigQuery 中查看資料表的中繼資料
前往 Google Cloud 控制台的「BigQuery」頁面。
查看 Iceberg 資料表中繼資料。
- PROJECT_ID:您的 Google Cloud 專案 ID。 專案 ID 會列在 Google Cloud 控制台資訊主頁的「專案資訊」部分。
- CLUSTER_NAME:Dataproc 叢集名稱。
- REGION:叢集所在的 Compute Engine 區域。
- CATALOG_NAME:Iceberg 目錄名稱。
- BUCKET 和 WAREHOUSE_FOLDER:用於 Iceberg 倉庫的 Cloud Storage bucket 和資料夾。 LOCATION:支援的 BigQuery 位置。 預設位置為「美國」。
jarFileUris
:列出的 JAR 檔案是建立 BigQuery Metastore 中的資料表中繼資料時的必要項目。properties
:目錄屬性。queryFileUri
:您複製到 Cloud Storage 值區的iceberg-table.sql
工作檔案。前往 Google Cloud 控制台的「BigQuery」頁面。
查看 Iceberg 資料表中繼資料。
使用 SSH 連線至 Dataproc 叢集的主要節點。
在 SSH 工作階段終端機中,使用
vi
或nano
文字編輯器,將下列指令複製到iceberg-table.sql
檔案中。SET CATALOG_NAME = `CATALOG_NAME`; SET BUCKET = `BUCKET`; SET WAREHOUSE_FOLDER = `WAREHOUSE_FOLDER`; USE `${CATALOG_NAME}`; CREATE NAMESPACE IF NOT EXISTS `${CATALOG_NAME}`.example_namespace; DROP TABLE IF EXISTS `${CATALOG_NAME}`.example_namespace.example_table; CREATE TABLE `${CATALOG_NAME}`.example_namespace.example_table (id int, data string) USING ICEBERG LOCATION 'gs://${BUCKET}/${WAREHOUSE_FOLDER}'; INSERT INTO `${CATALOG_NAME}`.example_namespace.example_table VALUES (1, 'first row'); ALTER TABLE `${CATALOG_NAME}`.example_namespace.example_table ADD COLUMNS (newDoubleCol double); DESCRIBE TABLE `${CATALOG_NAME}`.example_namespace.example_table;
更改下列內容:
- CATALOG_NAME:Iceberg 目錄名稱。
- BUCKET 和 WAREHOUSE_FOLDER:用於 Iceberg 倉庫的 Cloud Storage 值區和資料夾。
在 SSH 工作階段終端機中,執行下列
spark-sql
指令來建立 Iceberg 表格。spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1 \ --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.1-beta.jar \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.catalog-impl=org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog \ --conf spark.sql.catalog.CATALOG_NAME.gcp_project=PROJECT_ID \ --conf spark.sql.catalog.CATALOG_NAME.gcp_location=LOCATION \ --conf spark.sql.catalog.CATALOG_NAME.warehouse=gs://BUCKET/WAREHOUSE_FOLDER \ -f iceberg-table.sql
更改下列內容:
- PROJECT_ID:您的 Google Cloud 專案 ID。 專案 ID 會列在 Google Cloud 控制台資訊主頁的「專案資訊」部分。
- LOCATION:支援的 BigQuery 位置。預設位置為「美國」。
在 BigQuery 中查看資料表的中繼資料
前往 Google Cloud 控制台的「BigQuery」頁面。
查看 Iceberg 資料表中繼資料。
前往 Google Cloud 控制台的 Dataproc「Clusters」(叢集) 頁面。
選取叢集名稱,開啟「叢集詳細資料」頁面。
按一下「網路介面」分頁標籤,即可查看元件閘道連結清單,這些連結會連至叢集上安裝的預設和選用元件網路介面。
按一下「Zeppelin」連結,開啟 Zeppelin 網頁介面。
在 Zeppelin 網頁介面中,按一下「anonymous」選單,然後點選「Interpreter」開啟「Interpreters」頁面。
將兩個 JAR 新增至 Zeppelin Spark 解譯器,如下所示:
- 在
Search interpreters
方塊中輸入「Spark」,捲動至「Spark」Spark解譯器部分。 - 按一下 [edit] (編輯)。
將下列內容貼到「spark.jars」spark.jars欄位:
https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-spark-runtime-3.5_2.12/1.6.1/iceberg-spark-runtime-3.5_2.12-1.6.1.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.6.1-1.0.1-beta.jar
按一下「Spark interpreter」部分底部的「Save」,然後按一下「OK」,更新解譯器並以新設定重新啟動 Spark 解譯器。
- 在
在 Zeppelin 筆記本選單中,按一下「建立新記事」。
在「建立新記事」對話方塊中,輸入記事本名稱,然後接受預設的 spark 解譯器。按一下「建立」開啟記事本。
填入變數後,將下列 PySpark 程式碼複製到 Zeppelin 筆記本中。
%pyspark
from pyspark.sql import SparkSession
project_id = "PROJECT_ID" catalog = "CATALOG_NAME" namespace = "NAMESPACE" location = "LOCATION" warehouse_dir = "gs://BUCKET/WAREHOUSE_DIRECTORY"
spark = SparkSession.builder \ .appName("BigQuery Metastore Iceberg") \ .config(f"spark.sql.catalog.{catalog}", "org.apache.iceberg.spark.SparkCatalog") \ .config(f"spark.sql.catalog.{catalog}.catalog-impl", "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog") \ .config(f"spark.sql.catalog.{catalog}.gcp_project", f"{project_id}") \ .config(f"spark.sql.catalog.{catalog}.gcp_location", f"{location}") \ .config(f"spark.sql.catalog.{catalog}.warehouse", f"{warehouse_dir}") \ .getOrCreate()
spark.sql(f"USE `{catalog}`;") spark.sql(f"CREATE NAMESPACE IF NOT EXISTS `{namespace}`;") spark.sql(f"USE `{namespace}`;")
\# Create table and display schema (without LOCATION) spark.sql("DROP TABLE IF EXISTS example_iceberg_table") spark.sql("CREATE TABLE example_iceberg_table (id int, data string) USING ICEBERG") spark.sql("DESCRIBE example_iceberg_table;")
\# Insert table data. spark.sql("INSERT INTO example_iceberg_table VALUES (1, 'first row');")
\# Alter table, then display schema. spark.sql("ALTER TABLE example_iceberg_table ADD COLUMNS (newDoubleCol double);")
\# Select and display the contents of the table. spark.sql("SELECT * FROM example_iceberg_table").show()更改下列內容:
- PROJECT_ID:您的 Google Cloud 專案 ID。 專案 ID 會列在 Google Cloud 控制台資訊主頁的「專案資訊」部分。
- CATALOG_NAME 和 NAMESPACE:Iceberg 目錄名稱和命名空間會合併,以識別 Iceberg 資料表 (
catalog.namespace.table_name
)。 - LOCATION:支援的 BigQuery 位置。預設位置為「美國」。
- BUCKET 和 WAREHOUSE_DIRECTORY:做為 Iceberg 倉庫目錄的 Cloud Storage bucket 和資料夾。
按一下執行圖示或按下
Shift-Enter
即可執行程式碼。工作完成後,狀態訊息會顯示「Spark Job Finished」,輸出內容則會顯示表格內容:在 BigQuery 中查看資料表的中繼資料
前往 Google Cloud 控制台的「BigQuery」頁面。
查看 Iceberg 資料表中繼資料。
OSS 資料庫到 BigQuery 資料集的對應
請注意開放原始碼資料庫與 BigQuery 資料集術語之間的對應關係:
OSS 資料庫 BigQuery 資料集 命名空間、資料庫 資料集 分區或未分區資料表 資料表 查看 查看 建立 Iceberg 資料表
本節說明如何透過 Dataproc 服務、Spark SQL CLI 和 Zeppelin 元件網頁介面,將 Spark SQL 程式碼提交至 Dataproc 叢集,在 BigLake 中繼存放區建立含有中繼資料的 Iceberg 資料表。
Dataproc 工作
您可以透過下列方式,將工作提交至 Dataproc 服務:使用 Google Cloud 控制台或 Google Cloud CLI將工作提交至 Dataproc 叢集,或透過 HTTP REST 要求或程式輔助 gRPC Dataproc Cloud Client Libraries 呼叫 Dataproc Jobs API。
本節範例說明如何使用 gcloud CLI、 Google Cloud 控制台或 Dataproc REST API,將 Dataproc Spark SQL 工作提交至 Dataproc 服務,在 BigQuery 中建立含有中繼資料的 Iceberg 表格。
準備工作檔案
請按照下列步驟建立 Spark SQL 工作檔案。這個檔案包含用來建立及更新 Iceberg 資料表的 Spark SQL 指令。
接著,請下載並將
iceberg-spark-runtime-3.5_2.12-1.6.1
JAR 檔案複製到 Cloud Storage。提交 Spark SQL 工作
選取分頁標籤,按照指示使用 gcloud CLI、Google Cloud 主控台或 Dataproc REST API,將 Spark SQL 工作提交至 Dataproc 服務。
gcloud
控制台
請按照下列步驟,使用 Google Cloud 控制台將 Spark SQL 工作提交至 Dataproc 服務,在 BigLake 中繼資料存放區中建立含有中繼資料的 Iceberg 資料表。
REST
您可以使用 Dataproc jobs.submit API,將 Spark SQL 工作提交至 Dataproc 服務,在 BigLake Metastore 中建立含有中繼資料的 Iceberg 資料表。
使用任何要求資料之前,請先替換以下項目:
HTTP 方法和網址:
POST https://dataproc.googleapis.com/v1/projects/PROJECT_ID/regions/REGION/jobs:submit
JSON 要求主體:
{ "projectId": "PROJECT_ID", "job": { "placement": { "clusterName": "CLUSTER_NAME" }, "statusHistory": [], "reference": { "jobId": "", "projectId": "PROJECT_ID" }, "sparkSqlJob": { "properties": { "spark.sql.catalog."CATALOG_NAME": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog."CATALOG_NAME".catalog-impl": "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog", "spark.sql.catalog."CATALOG_NAME".gcp_project": "PROJECT_ID", "spark.sql.catalog."CATALOG_NAME".gcp_location": "LOCATION", "spark.sql.catalog."CATALOG_NAME".warehouse": "gs://BUCKET/WAREHOUSE_FOLDER" }, "jarFileUris": [ "gs://BUCKET/iceberg-spark-runtime-3.5_2.12-1.5.2.jar,gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.1-beta.jar" ], "scriptVariables": {}, "queryFileUri": "gs://BUCKET/iceberg-table.sql" } } }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
{ "reference": { "projectId": "PROJECT_ID", "jobId": "..." }, "placement": { "clusterName": "CLUSTER_NAME", "clusterUuid": "..." }, "status": { "state": "PENDING", "stateStartTime": "..." }, "submittedBy": "USER", "sparkSqlJob": { "queryFileUri": "gs://BUCKET/iceberg-table.sql", "properties": { "spark.sql.catalog.USER_catalog": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.USER_catalog.catalog-impl": "org.apache.iceberg.gcp.bigquery.BigQueryMetastoreCatalog", "spark.sql.catalog.USER_catalog.gcp_project": "PROJECT_ID", "spark.sql.catalog.USER_catalog.gcp_location": "LOCATION", "spark.sql.catalog.USER_catalog.warehouse": "gs://BUCKET/WAREHOUSE_FOLDER" }, "jarFileUris": [ "gs://BUCKET/iceberg-spark-runtime-3.5_2.12-1.5.2.jar", "gs://spark-lib/bigquery/iceberg-bigquery-catalog-1.5.2-1.0.1-beta.jar" ] }, "driverControlFilesUri": "gs://dataproc-...", "driverOutputResourceUri": "gs://dataproc-.../driveroutput", "jobUuid": "...", "region": "REGION" }
如要監控工作進度及查看工作輸出內容,請前往 Google Cloud 控制台的 Dataproc「Jobs」(工作) 頁面,然後按一下
Job ID
開啟「Job details」(工作詳細資料) 頁面。如要在 BigQuery 中查看資料表的中繼資料
Spark SQL CLI
下列步驟說明如何使用在 Dataproc 叢集主節點上執行的 Spark SQL CLI,建立 Iceberg 表格並將表格中繼資料儲存在 BigLake 中繼資料存放區。
Zeppelin 網頁介面
下列步驟說明如何使用在 Dataproc 叢集主節點上執行的 Zeppelin 網頁介面,建立 Iceberg 資料表並將資料表的中繼資料儲存在 BigLake Metastore 中。