Apache Iceberg 代管資料表
Apache Iceberg 代管資料表 (前身為 BigQuery 中的 Apache Iceberg 專用 BigLake 資料表) 是在 Google Cloud上建構開放格式 lakehouse 的基礎。Iceberg 受管理資料表與標準 BigQuery 資料表一樣,提供全代管體驗,但資料會儲存在客戶擁有的儲存空間 bucket。Iceberg 受管理資料表支援開放式 Iceberg 資料表格式,可與單一資料副本上的開放原始碼和第三方運算引擎互通。
Iceberg 代管資料表支援下列功能:
- 使用 GoogleSQL 資料操縱語言 (DML) 進行資料表變異。
- 透過 Spark、Dataflow 和其他引擎等連接器,使用 BigQuery Storage Write API 統一處理批次和高處理量串流。
- 匯出 Iceberg V2 快照並在每次資料表變動時自動重新整理,以便使用開放原始碼和第三方查詢引擎 (例如 Spark) 直接查詢。
- 結構定義演變:可新增、捨棄及重新命名資料欄,以符合您的需求。您也可以使用這項功能變更現有資料欄的資料類型和模式。詳情請參閱「轉換規則」。
- 自動儲存空間最佳化,包括調整檔案大小、自動叢集、垃圾回收和中繼資料最佳化。
- 時間旅行:在 BigQuery 中存取歷來資料。
- 資料欄層級安全防護和資料遮蓋。
- 多陳述式交易 (在預覽版中)。
- 資料表分區 (預先發布版)。
- 在 Dataform 工作流程中建立資料表。
架構
Iceberg 代管資料表可將 BigQuery 資源管理功能帶到您自有雲端 bucket 中的資料表,您可以在這些資料表上使用 BigQuery 和開放原始碼運算引擎,不必將資料移出您控管的 bucket。您必須先設定 Cloud Storage bucket,才能開始使用 Iceberg 受管理資料表。
使用 Iceberg 管理的資料表會對儲存空間造成下列影響:
- BigQuery 會根據寫入要求和背景儲存空間最佳化作業 (例如 DML 陳述式和串流),在值區中建立新的資料檔案。
- 系統會自動壓縮及叢集處理 bucket 中的資料檔案。時間旅行視窗過期後,資料檔案會遭到垃圾收集。不過,如果刪除資料表,相關聯的資料檔案就不會進行垃圾收集。詳情請參閱「儲存空間最佳化」。
建立 Iceberg 代管資料表與建立 BigQuery 資料表類似。由於資料湖泊會在 Cloud Storage 中以開放格式儲存資料,因此您必須執行下列操作:
- 使用
WITH CONNECTION指定雲端資源連結,設定 BigQuery 存取 Cloud Storage 的連線憑證。 - 使用
file_format = PARQUET陳述式,將資料儲存的檔案格式指定為PARQUET。 - 使用
table_format = ICEBERG陳述式,將開放原始碼中繼資料表格式指定為ICEBERG。
最佳做法
直接在 BigQuery 外部變更或新增儲存空間中的檔案,可能會導致資料遺失或發生無法復原的錯誤。下表說明可能的情況:
| 作業 | 後果 | 預防方法 |
|---|---|---|
| 在 BigQuery 以外的位置,將新檔案新增至值區。 | 資料遺失:BigQuery 不會追蹤在 BigQuery 外部新增的檔案或物件。背景垃圾回收程序會刪除未追蹤的檔案。 | 只能透過 BigQuery 新增資料。這樣 BigQuery 就能追蹤檔案,並防止檔案遭到垃圾收集。 為避免意外新增資料和資料遺失,我們也建議限制外部工具對含有 Iceberg 代管表格的 bucket 寫入資料。 |
| 在非空白前置字元中建立新的 Iceberg 代管資料表。 | 資料遺失:BigQuery 不會追蹤現有資料,因此這些檔案會視為未追蹤,並由背景垃圾回收程序刪除。 | 只能在空白前置字元中建立新的 Iceberg 受管理資料表。 |
| 修改或取代 Iceberg 管理的資料表資料檔案。 | 資料遺失:如果外部修改或取代資料表,一致性檢查就會失敗,導致資料表無法讀取。針對資料表執行的查詢會失敗。 此時無法自行復原。如要尋求資料復原協助,請與支援團隊聯絡。 |
只能透過 BigQuery 修改資料。這樣 BigQuery 就能追蹤檔案,並防止檔案遭到垃圾收集。 為避免意外新增資料和資料遺失,我們也建議限制外部工具對含有 Iceberg 代管表格的 bucket 寫入資料。 |
| 在相同或重疊的 URI 上建立兩個 Iceberg 代管資料表。 | 資料遺失:BigQuery 不會橋接 Iceberg 受管理資料表的相同 URI 執行個體。每個資料表的背景垃圾回收程序都會將對向資料表的檔案視為未追蹤,並刪除這些檔案,導致資料遺失。 | 為每個 Iceberg 受管理資料表使用專屬 URI。 |
Cloud Storage 值區設定最佳做法
Cloud Storage 儲存空間的設定及其與 BigQuery 的連線,會直接影響 Iceberg 受管理資料表的效能、費用、資料完整性、安全性及管理。以下是設定這項功能的最佳做法:
選取名稱時,請清楚指出該 bucket 僅適用於 Iceberg 管理的資料表。
選擇與 BigQuery 資料集位於相同區域的單一區域 Cloud Storage 值區。這項協調作業可避免資料移轉費用,進而提升效能並降低成本。
根據預設,Cloud Storage 會將資料儲存在 Standard Storage 儲存空間級別中,這類別可提供充足的效能。如要盡量降低資料儲存成本,可以啟用 Autoclass,讓系統自動管理儲存空間級別轉換。自動調整級別功能會從 Standard Storage 開始,將未存取的物件移至存取頻率較低的級別,藉此降低儲存空間費用。再次讀取物件時,物件會移回 Standard 類別。
確認已將必要角色指派給正確的使用者和服務帳戶。
為避免 Cloud Storage bucket 中的資料遭到意外刪除或毀損,請限制貴機構中大多數使用者的寫入和刪除權限。如要這麼做,請設定儲存空間權限政策,並加入條件,拒絕所有使用者 (您指定的使用者除外) 的
PUT和DELETE要求。啟用稽核記錄,確保作業透明度、進行疑難排解,以及監控資料存取權。
保留預設的虛刪除政策 (保留 7 天),防止物件遭到意外刪除。不過,如果發現資料已遭刪除,請與支援團隊聯絡,而非手動還原物件,因為 BigQuery 中繼資料不會追蹤在 BigQuery 外部新增或修改的物件。
系統會自動啟用適應性檔案大小調整、自動叢集和垃圾回收功能,協助您最佳化檔案效能和成本。
請避免使用下列 Cloud Storage 功能,因為 Iceberg 受管理資料表不支援這些功能:
- 階層式命名空間
- 物件存取控制清單 (ACL)
- 客戶提供的加密金鑰
- 物件版本管理
- 物件鎖定
- bucket 鎖定功能
- 使用 BigQuery API 或 bq CLI 還原已軟刪除的物件
如要實作這些最佳做法,請使用下列指令建立值區:
gcloud storage buckets create gs://BUCKET_NAME \ --project=PROJECT_ID \ --location=LOCATION \ --enable-autoclass \ --public-access-prevention \ --uniform-bucket-level-access
更改下列內容:
BUCKET_NAME:新 bucket 的名稱PROJECT_ID:專案 IDLOCATION:新值區的位置
Iceberg 代管資料表工作流程
下列各節說明如何建立、載入、管理及查詢 Iceberg 代管資料表。
事前準備
建立及使用 Iceberg 受管理資料表前,請務必先設定儲存空間值區的Cloud 資源連結。連線必須具備儲存空間 bucket 的寫入權限,如「必要角色」一節所述。如要進一步瞭解連線所需的角色和權限,請參閱「管理連線」。
必要的角色
如要取得讓 BigQuery 管理專案中資料表所需的權限,請要求管理員授予您下列 IAM 角色:
-
如要建立 Iceberg 受管理資料表,請按照下列步驟操作:
- 專案的 BigQuery 資料擁有者 (
roles/bigquery.dataOwner) - 專案的 BigQuery 連線管理員 (
roles/bigquery.connectionAdmin)
- 專案的 BigQuery 資料擁有者 (
-
如要查詢 Iceberg 代管資料表:
- 專案的 BigQuery 資料檢視者 (
roles/bigquery.dataViewer) - BigQuery 使用者 (
roles/bigquery.user) 專案
- 專案的 BigQuery 資料檢視者 (
-
將下列角色授予連線服務帳戶,以便讀取及寫入 Cloud Storage 中的資料:
- Storage 物件使用者 (
roles/storage.objectUser) (針對值區) - 值區的「Storage 舊版值區讀取者」 (
roles/storage.legacyBucketReader)
- Storage 物件使用者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備讓 BigQuery 管理專案中資料表所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
如要讓 BigQuery 管理專案中的資料表,您必須具備下列權限:
-
全部:
-
專案的
bigquery.connections.delegate -
專案的
bigquery.jobs.create -
專案的
bigquery.readsessions.create -
專案的
bigquery.tables.create -
專案的
bigquery.tables.get -
專案的
bigquery.tables.getData -
storage.buckets.get在 bucket 上 -
storage.objects.create在 bucket 上 -
storage.objects.delete在 bucket 上 -
storage.objects.get在 bucket 上 -
storage.objects.list在 bucket 上
-
專案的
建立 Iceberg 代管資料表
如要建立 Iceberg 代管資料表,請選取下列其中一種方法:
SQL
CREATE TABLE [PROJECT_ID.]DATASET_ID.TABLE_NAME ( COLUMN DATA_TYPE[, ...] ) CLUSTER BY CLUSTER_COLUMN_LIST WITH CONNECTION {CONNECTION_NAME | DEFAULT} OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'STORAGE_URI');
更改下列內容:
- PROJECT_ID:包含資料集的專案。如果未定義,指令會採用預設專案。
- DATASET_ID:現有資料集。
- TABLE_NAME:您要建立的資料表名稱。
- DATA_TYPE:資料欄所含資訊的資料類型。
- CLUSTER_COLUMN_LIST (選用):以半形逗號分隔的清單,最多包含四個資料欄。必須是頂層的非重複資料欄。
- CONNECTION_NAME:連線名稱。例如:
myproject.us.myconnection。如要使用預設連線,請指定DEFAULT,而非連線名稱。 - STORAGE_URI:完整合格的 Cloud Storage URI。例如:
gs://mybucket/table。
bq
bq --project_id=PROJECT_ID mk \ --table \ --file_format=PARQUET \ --table_format=ICEBERG \ --connection_id=CONNECTION_NAME \ --storage_uri=STORAGE_URI \ --schema=COLUMN_NAME:DATA_TYPE[, ...] \ --clustering_fields=CLUSTER_COLUMN_LIST \ DATASET_ID.MANAGED_TABLE_NAME
更改下列內容:
- PROJECT_ID:包含資料集的專案。如果未定義,指令會採用預設專案。
- CONNECTION_NAME:連線名稱。例如:
myproject.us.myconnection。 - STORAGE_URI:完整合格的 Cloud Storage URI。例如:
gs://mybucket/table。 - COLUMN_NAME:資料欄名稱。
- DATA_TYPE:資料欄所含資訊的資料類型。
- CLUSTER_COLUMN_LIST (選用):以半形逗號分隔的清單,最多包含四個資料欄。必須是頂層的非重複資料欄。
- DATASET_ID:現有資料集的 ID。
- MANAGED_TABLE_NAME:您要建立的資料表名稱。
API
使用已定義的資料表資源呼叫 tables.insert 方法,類似於下列範例:
{ "tableReference": { "tableId": "TABLE_NAME" }, "biglakeConfiguration": { "connectionId": "CONNECTION_NAME", "fileFormat": "PARQUET", "tableFormat": "ICEBERG", "storageUri": "STORAGE_URI" }, "schema": { "fields": [ { "name": "COLUMN_NAME", "type": "DATA_TYPE" } [, ...] ] } }
更改下列內容:
- TABLE_NAME:您要建立的資料表名稱。
- CONNECTION_NAME:連線名稱。例如:
myproject.us.myconnection。 - STORAGE_URI:完整合格的 Cloud Storage URI。您也可以使用萬用字元。例如:
gs://mybucket/table。 - COLUMN_NAME:資料欄名稱。
- DATA_TYPE:資料欄所含資訊的資料類型。
將資料匯入 Iceberg 受管理資料表
以下各節說明如何將各種資料表格式的資料匯入 Iceberg 管理的資料表。
從平面檔案標準載入資料
Iceberg 代管資料表會使用 BigQuery 載入工作,將外部檔案載入 Iceberg 代管資料表。如果您有現有的 Iceberg 受管理資料表,請按照 bq load CLI 指南或 LOAD SQL 指南載入外部資料。載入資料後,新的 Parquet 檔案會寫入 STORAGE_URI/data 資料夾。
如果使用先前的指示,但沒有現有的 Iceberg 受管理資料表,系統會改為建立 BigQuery 資料表。
如需將批次資料載入 Iceberg 受管理資料表的工具專屬範例,請參閱下列內容:
SQL
LOAD DATA INTO MANAGED_TABLE_NAME FROM FILES ( uris=['STORAGE_URI'], format='FILE_FORMAT');
更改下列內容:
- MANAGED_TABLE_NAME:現有 Iceberg 受管理資料表的名稱。
- STORAGE_URI:完整的 Cloud Storage URI,或是以逗號分隔的 URI 清單。您也可以使用萬用字元。例如:
gs://mybucket/table。 - FILE_FORMAT:來源資料表格式。如要瞭解支援的格式,請參閱
load_option_list的format列。
bq
bq load \ --source_format=FILE_FORMAT \ MANAGED_TABLE \ STORAGE_URI
更改下列內容:
- FILE_FORMAT:來源資料表格式。如要瞭解支援的格式,請參閱
load_option_list的format列。 - MANAGED_TABLE_NAME:現有 Iceberg 受管理資料表的名稱。
- STORAGE_URI:完整的 Cloud Storage URI,或是以逗號分隔的清單 URI。您也可以使用萬用字元。例如:
gs://mybucket/table。
從 Apache Hive 分區檔案標準載入
您可以使用標準 BigQuery 載入工作,將 Hive 分區檔案載入 Iceberg 代管資料表。詳情請參閱載入外部分區資料。
從 Pub/Sub 載入串流資料
您可以使用 Pub/Sub BigQuery 訂閱項目,將串流資料載入 Iceberg 代管資料表。
從 Iceberg 受管理資料表匯出資料
以下各節說明如何將 Iceberg 代管資料表中的資料匯出為各種資料表格式。
將資料匯出為平面格式
如要將 Iceberg 代管資料表匯出為平面格式,請使用 EXPORT DATA 陳述式,並選取目標格式。詳情請參閱匯出資料。
建立 Iceberg 代管資料表中繼資料快照
如要建立 Iceberg 代管資料表的中繼資料快照,請按照下列步驟操作:
使用
EXPORT TABLE METADATASQL 陳述式,將中繼資料匯出為 Iceberg V2 格式。選用:排定 Iceberg 中繼資料快照重新整理時間。 如要根據設定的時間間隔重新整理 Iceberg 中繼資料快照,請使用排定查詢。
選用:為專案啟用中繼資料自動重新整理功能,即可在每次資料表變動時,自動更新 Iceberg 資料表中繼資料快照。如要啟用中繼資料自動重新整理功能,請來信至 bigquery-tables-for-apache-iceberg-help@google.com。每次重新整理作業都會產生
EXPORT METADATA費用。
下列範例使用 DDL 陳述式 EXPORT TABLE METADATA FROM
mydataset.test,建立名為 My Scheduled Snapshot
Refresh Query 的排程查詢。DDL 陳述式每 24 小時執行一次。
bq query \ --use_legacy_sql=false \ --display_name='My Scheduled Snapshot Refresh Query' \ --schedule='every 24 hours' \ 'EXPORT TABLE METADATA FROM mydataset.test'
查看 Iceberg 受管理資料表的中繼資料快照
重新整理 Iceberg 代管資料表中繼資料快照後,您可以在 Iceberg 代管資料表原始建立位置的 Cloud Storage URI 中找到快照。/data 資料夾包含 Parquet 檔案資料分片,/metadata 資料夾則包含 Iceberg 管理的資料表中繼資料快照。
SELECT table_name, REGEXP_EXTRACT(ddl, r"storage_uri\s*=\s*\"([^\"]+)\"") AS storage_uri FROM `mydataset`.INFORMATION_SCHEMA.TABLES;
請注意,mydataset 和 table_name 是實際資料集和資料表的預留位置。
使用 Spark 讀取 Iceberg 代管資料表
下列範例會設定環境,以便搭配使用 Spark SQL 和 Spark,然後執行查詢,從指定的 Iceberg 受管理資料表擷取資料。
spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \ --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \ # Query the table SELECT * FROM CATALOG_NAME.FOLDER_NAME;
更改下列內容:
- ICEBERG_VERSION_NUMBER:目前的執行階段版本。從 Iceberg 版本下載最新版本。
- CATALOG_NAME:用來參照 Iceberg 代管資料表的目錄。
- BUCKET_PATH:包含資料表檔案的 bucket 路徑。
例如:
gs://mybucket/。 - FOLDER_NAME:包含資料表檔案的資料夾。例如:
myfolder。
修改 Iceberg 管理的資料表
如要修改 Iceberg 受管理資料表,請按照「修改資料表結構定義」一文中的步驟操作。
使用多陳述式交易
如要存取 Iceberg 受管理資料表的多陳述式交易,請填寫註冊表單。
使用分區
如要存取 Iceberg 代管資料表的分區功能,請填寫註冊表單。
您可以指定分區資料欄來區隔資料表,藉此將資料表分區。Iceberg 受管理資料表支援下列資料欄類型:
DATEDATETIMETIMESTAMP
依據 DATE、DATETIME 或 TIMESTAMP 資料欄分區的資料表稱為時間單位資料欄分區。您可以選擇分區的時間間隔為小時、日、月或年。
Iceberg 管理的資料表也支援叢集,以及合併叢集和分區資料表。
分區限制
- 適用所有 BigQuery 分區資料表限制。
- 不支援
DATE、DATETIME或TIMESTAMP以外的分區資料欄類型。 - 不支援分區到期。
- 不支援分區演進。
建立分區 Iceberg 代管資料表
如要建立分區 Iceberg 受管理資料表,請按照建立標準 Iceberg 受管理資料表的指示操作,並根據您的環境加入下列其中一項:
修改及查詢分區 Iceberg 受管理資料表
分區 Iceberg 代管資料表的 BigQuery 資料操縱語言 (DML) 陳述式和查詢,與標準 Iceberg 代管資料表相同。BigQuery 會自動將工作範圍限定在正確的分區,類似於 Iceberg 隱藏分區。此外,您新增至資料表的任何新資料都會自動分割。
您也可以使用其他引擎查詢分區 Iceberg 代管資料表,方式與標準 Iceberg 代管資料表相同。建議啟用中繼資料快照,以獲得最佳體驗。
為提升安全性,Iceberg 受管理資料表的分區資訊會與資料路徑分離,並完全由中繼資料層管理。
定價
Iceberg 受管理資料表的定價包括儲存空間、儲存空間最佳化,以及查詢和工作。
儲存空間
Iceberg 受管理資料表會將所有資料儲存在 Cloud Storage。系統會針對所有儲存的資料收費,包括歷史資料表資料。您可能也需要支付 Cloud Storage 資料處理和移轉費用。透過 BigQuery 或 BigQuery Storage API 處理的作業,可能免除部分 Cloud Storage 作業費用。不會收取 BigQuery 專屬的儲存費用。詳情請參閱 Cloud Storage 定價。
儲存空間最佳化
Iceberg 代管資料表會自動管理資料表,包括壓縮、分群、垃圾回收,以及產生/重新整理 BigQuery 中繼資料,以提升查詢效能並降低儲存空間成本。資料表管理功能的運算資源用量會以資料運算單元 (DCU) 為單位,按秒累加計費。詳情請參閱「Iceberg 受管理資料表定價」。
透過 Storage Write API 串流資料時進行的資料匯出作業,會計入 Storage Write API 價格,不會以背景維護作業計費。詳情請參閱「資料擷取定價」。
如要查看這些背景作業的記錄和運算用量,請查詢 INFORMATION_SCHEMA.JOBS 檢視畫面。如需查詢範例,請參閱下列內容:
查詢和工作
與 BigQuery 資料表類似,如果您使用 BigQuery 隨選定價,系統會根據查詢和讀取的位元組 (每 TiB) 收費;如果您使用 BigQuery 容量運算定價,系統會根據運算單元消耗量 (每運算單元時數) 收費。
BigQuery 定價也適用於 BigQuery Storage Read API 和 Storage Write API。
載入和匯出作業 (例如 EXPORT METADATA) 會使用 Enterprise 版隨用隨付方案的配額。這與 BigQuery 資料表不同,因為這些作業不會產生費用。如果 PIPELINE 保留項目提供 Enterprise 或 Enterprise Plus 配額,載入和匯出作業會優先使用這些保留項目配額。
限制
Iceberg 受管理資料表有下列限制:
- Iceberg 代管資料表不支援重新命名作業或
ALTER TABLE RENAME TO陳述式。 - Iceberg 受管理資料表不支援資料表副本或
CREATE TABLE COPY陳述式。 - Iceberg 代管資料表不支援資料表副本或
CREATE TABLE CLONE陳述式。 - Iceberg 受管理資料表不支援資料表快照或
CREATE SNAPSHOT TABLE陳述式。 - Iceberg 受管理資料表不支援下列資料表結構:
- Iceberg 受管理資料表不支援下列結構定義演變案例:
NUMERIC至FLOAT型別強制轉換INT至FLOAT型別強制轉換- 使用 SQL DDL 陳述式,在現有的
RECORD資料欄中新增巢狀欄位
- 透過控制台或 API 查詢時,Iceberg 管理的資料表會顯示 0 位元組的儲存空間大小。
- Iceberg 代管資料表不支援具體化檢視區塊。
- Iceberg 受管理資料表不支援授權檢視表,但支援資料欄層級存取權控管。
- Iceberg 代管資料表不支援變更資料擷取 (CDC) 更新。
- Iceberg 代管資料表不支援代管災難復原
- Iceberg 代管資料表不支援資料列層級安全防護機制。
- Iceberg 代管資料表不支援安全防護時間範圍。
- Iceberg 受管理資料表不支援擷取工作。
INFORMATION_SCHEMA.TABLE_STORAGE檢視畫面不包含 Iceberg 代管資料表。- 系統不支援將 Iceberg 代管資料表做為查詢結果目的地。您可以改用
CREATE TABLE陳述式搭配AS query_statement引數,將資料表建立為查詢結果目的地。 CREATE OR REPLACE不支援以 Iceberg 受管理資料表取代標準資料表,也不支援以標準資料表取代 Iceberg 受管理資料表。- 批次載入和
LOAD DATA陳述式僅支援將資料附加至現有的 Iceberg 代管資料表。 - 批次載入和
LOAD DATA陳述式不支援結構定義更新。 TRUNCATE TABLE不支援 Iceberg 管理的資料表。您可以採用以下兩種替代方式:CREATE OR REPLACE TABLE,並使用相同的資料表建立選項。DELETE FROMtableWHEREtrue
APPENDS資料表值函式 (TVF) 不支援 Iceberg 管理的資料表。- Iceberg 中繼資料可能不包含過去 90 分鐘內,透過 Storage Write API 串流至 BigQuery 的資料。
- 使用
tabledata.list進行記錄式分頁存取時,不支援 Iceberg 代管資料表。 - 每個 Iceberg 代管資料表只能執行一個並行變動 DML 陳述式 (
UPDATE、DELETE和MERGE)。其他變動 DML 陳述式會排入佇列。