View a markdown version of this page

使用 Apache Iceberg V3 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Apache Iceberg V3

Apache Iceberg 第 3 版 (V3) 是 Apache Iceberg 資料表格式規格的最新版本,引入了進階功能,可建置 PB 級資料湖,以改善效能並減少營運開銷。V3 解決了第 2 版 (V2) 常見的效能瓶頸,特別是在批次更新和合規刪除方面。

AWS 支援 Apache Iceberg 第 3 版 (V3) 規格中定義的刪除向量、資料列歷程和變體資料類型。您可以在 Amazon EMRAWS Glue ETLAmazon SageMaker Unified Studio 筆記本AWS Glue Data Catalog 中的 Apache Iceberg 資料表上使用這些功能,包括 Amazon S3 資料表。變體資料類型專屬於 S3 Tables。

V3 中的主要功能

刪除向量

以儲存為 Puffin 檔案的有效二進位格式取代 V2 的位置刪除檔案。這可消除隨機批次更新和 GDPR 合規刪除的寫入放大,大幅降低維護新資料的額外負荷。處理高頻率更新的組織將立即改善寫入效能,並從較少的小型檔案降低儲存成本。

資料列線性

在資料列層級啟用精確的變更追蹤。您的下游系統可以逐步處理變更,加速資料管道並降低變更資料擷取 (CDC) 工作流程的運算成本。此內建功能不需要自訂變更追蹤實作。

變體資料類型

使用變體資料類型,您可以直接在 Iceberg 資料表中寫入 JSON 等半結構化資料,而無需事先定義固定結構描述。V3 相容引擎會在寫入時將半結構化資料分割成隱藏的資料欄,產生查詢引擎用於最佳化的 Parquet 資料欄統計資料,例如檔案刪除。這可減少分析查詢掃描的資料。S3 Tables 為變體資料欄提供持續的資料表維護,包括壓縮,因此您可以將來自半結構化來源的資料合併到 Iceberg 引擎可以有效讀取的大型檔案中。

版本相容性

V3 與 V2 資料表保持回溯相容性。 AWS 服務同時支援 V2 和 V3 資料表,可讓您:

  • 跨 V2 和 V3 資料表執行查詢

  • 將現有的 V2 資料表升級至 V3,無需重新寫入資料

  • 執行跨越 V2 和 V3 快照的時間歷程查詢

  • 跨資料表版本使用結構描述演變和隱藏分割

重要

V3 是單向升級。一旦資料表從 V2 升級至 V3,就無法透過標準操作降級回 V2。

V3 入門

先決條件

使用 V3 資料表之前,請確定您有:

  • 具有適當 IAM 許可 AWS 的帳戶

  • 存取一或多個 AWS 分析服務 (EMR、Glue、Amazon SageMaker Unified Studio 筆記本或 S3 資料表)

  • 用於儲存資料表資料和中繼資料的 S3 儲存貯體

  • 如果您要建置自己的 Iceberg 基礎設施,可使用 S3 Tables 或一般用途 S3 儲存貯體的資料表儲存貯體

  • AWS 已設定的 Glue 目錄

建立 V3 資料表

建立新的 V3 資料表

若要建立新的 Iceberg V3 資料表,請將 format-version 資料表屬性設定為 3。

使用 Spark SQL:

CREATE TABLE IF NOT EXISTS myns.orders_v3 ( order_id bigint, customer_id string, order_date date, total_amount decimal(10,2), status string, created_at timestamp ) USING iceberg TBLPROPERTIES ( 'format-version' = '3' )

將 V2 資料表升級至 V3

您可以將現有的 V2 資料表以原子方式升級至 V3,而無需重寫資料。

使用 Spark SQL:

ALTER TABLE myns.existing_table SET TBLPROPERTIES ('format-version' = '3')
重要

V3 是單向升級。一旦資料表從 V2 升級至 V3,就無法透過標準操作降級回 V2。

升級期間會發生什麼情況:

  • 會以原子方式建立新的中繼資料快照

  • 重複使用現有的 Parquet 資料檔案

  • 資料列線性欄位會新增至資料表中繼資料

  • 下一個壓縮動作會移除舊的 V2 刪除檔案

  • 新的修改將使用 V3 的刪除向量檔案

  • 升級不會執行資料列列變更追蹤記錄的歷史回填

啟用刪除向量

若要利用刪除向量進行更新、刪除和合併,請設定您的寫入模式。

使用 Spark SQL:

ALTER TABLE myns.orders_v3 SET TBLPROPERTIES ('format-version' = '3', 'write.delete.mode' = 'merge-on-read', 'write.update.mode' = 'merge-on-read', 'write.merge.mode' = 'merge-on-read' )

這些設定可確保更新、刪除和合併操作會建立刪除向量檔案,而不是重寫整個資料檔案。

利用 Row-lineage 進行變更追蹤

V3 會自動新增資料列中繼資料欄位以追蹤變更。

使用 Spark SQL:

# Query with parameter value provided last_processed_sequence = 47 SELECT id, data, _row_id, _last_updated_sequence_number FROM myns.orders_v3 WHERE _last_updated_sequence_number > :last_processed_sequence

_row_id 欄位可唯一識別每一列,而 _last_updated_sequence_number 則會追蹤列上次修改的時間。使用這些欄位來:

  • 識別變更的資料列以進行增量處理

  • 追蹤資料譜系的合規性

  • 最佳化 CDC 管道

  • 僅處理變更以降低運算成本

使用變體資料類型

重要

變體資料類型僅適用於特定 AWS 區域。如需支援區域的完整清單,請參閱 可用性

使用變體資料類型,您可以直接在 Iceberg 資料表中寫入 JSON 等半結構化資料,而無需事先定義固定結構描述。您可以更快速地寫入資料,同時仍能獲得高效率的分析查詢效能。Iceberg V3 相容引擎會在您寫入時將半結構化資料分割成隱藏的資料欄。這些隱藏的資料欄會產生查詢引擎用於最佳化的 Parquet 資料欄統計資料,例如檔案刪除。

使用 Spark SQL 建立具有變體資料欄的資料表:

CREATE TABLE IF NOT EXISTS myns.events ( event_id bigint, event_timestamp timestamp, source string, event_data VARIANT ) USING iceberg TBLPROPERTIES ( 'format-version' = '3' )

將半結構化資料插入變體資料欄:

INSERT INTO myns.events VALUES ( 1, current_timestamp(), 'web-app', PARSE_JSON('{"user_id": "u-1234", "action": "page_view", "page": "/products", "duration_ms": 350}') ); INSERT INTO myns.events VALUES ( 2, current_timestamp(), 'mobile-app', PARSE_JSON('{"user_id": "u-5678", "action": "purchase", "items": [{"sku": "A100", "qty": 2}], "total": 49.99}') );

使用 S3 Tables,變體資料欄的資料表維護,包括壓縮,會自動執行。壓縮會將來自小型檔案的半結構化來源資料合併為更大的檔案,Iceberg 引擎可以更有效率地讀取這些檔案,進而改善查詢效能。

V3 的最佳實務

何時使用 V3

在下列情況下,請考慮升級至 V3 或從 V3 開始:

  • 您經常執行批次更新或刪除

  • 您需要符合 GDPR 或合規刪除要求

  • 您的工作負載涉及高頻率 upsert

  • 您需要有效率的 CDC 工作流程

  • 您想要降低小型檔案的儲存成本

  • 您需要更好的變更追蹤功能

最佳化寫入效能

  • 為繁重的更新工作負載啟用刪除向量:

    SET TBLPROPERTIES ( 'write.delete.mode' = 'merge-on-read', 'write.update.mode' = 'merge-on-read', 'write.merge.mode' = 'merge-on-read' )
  • 設定適當的檔案大小:

    SET TBLPROPERTIES ( 'write.target-file-size-bytes' = '536870912' — 512 MB )

最佳化讀取效能

  • 利用資料列線性進行增量處理

  • 使用時間歷程來存取歷史資料,無需複製

  • 啟用統計資料收集,以便更好地規劃查詢

遷移策略

從 V2 遷移至 V3 時:

  • 先在非生產環境中測試 - 驗證升級程序和效能

  • 在低活動期間升級 - 將對並行操作的影響降至最低

  • 監控初始效能 - 升級後追蹤指標

  • 執行壓縮 - 升級後合併刪除檔案

  • 更新文件 - 反映團隊文件中的 V3 功能

相容性考量事項

  • 引擎版本 - 確保所有存取資料表的引擎都支援 V3

  • 第三方工具 - 在升級之前驗證 V3 相容性

  • 備份策略 - 測試快照型復原程序

  • 監控 - 更新 V3-specific指標的監控儀表板

壓縮的考量事項

根據預設,壓縮會寫入碎片變體 Parquet 檔案。不支援碎片的較舊讀取器可能無法讀取壓縮的檔案。您可以透過設定資料表屬性 來停用碎片write.variant.shredding.enabled=false

疑難排解

常見問題

錯誤:「不支援 格式版本 3」
  • 檢查您的查詢引擎目錄是否與 Iceberg V3 相容。

  • 請確定您使用的是最新的 AWS 服務版本。

  • 確認您的引擎版本支援 V3

    Amazon AWS 服務的 V3 支援如下所示:

    服務 V3 支援 V3 變體支援
    EMR Spark 7.12+ 版 8.0+ 版
    AWS Glue ETL
    Amazon SageMaker Unified Studio 筆記本
    AWS Glue:Iceberg REST API、資料表維護
    Amazon S3 資料表:Iceberg REST API、資料表維護 是*
    Amazon Athena (Trino)

    *部分區域可用性

升級後效能降低
  • 確認沒有壓縮失敗。如需詳細資訊,請參閱記錄和監控 S3 資料表

  • 檢查是否已啟用刪除向量。請確定已設定下列屬性:

    SET TBLPROPERTIES ( 'write.delete.mode' = 'merge-on-read', 'write.update.mode' = 'merge-on-read', 'write.merge.mode' = 'merge-on-read' )
  • 您可以使用下列程式碼來驗證資料表屬性:

    DESCRIBE FORMATTED myns.orders_v3
  • 檢閱分割區策略。過度分割可能會導致小型檔案。執行下列查詢以取得資料表的平均檔案大小:

    SELECT avg(file_size_in_bytes) as avg_file_size_bytes FROM myns.orders_v3.files
與第三方工具不相容
  • 驗證工具支援 V3 規格

  • 考慮維護不支援工具的 V2 資料表

  • V3 支援時間表的聯絡工具廠商

取得說明

  • AWS 支援:聯絡 AWS Support 了解服務特有的問題

  • Apache Iceberg 社群:Iceberg Slack

  • AWS 文件: AWS 分析文件

定價

可用性

Amazon EMR、 AWS Glue Data Catalog、 AWS Glue ETL 和 SV3 Apache Iceberg V3 刪除向量和資料列譜。 AWS S3

S3 Tables 中的變體資料類型適用於下列 AWS 區域:美國東部 (維吉尼亞北部)、美國東部 (俄亥俄)、美國西部 (奧勒岡)、亞太區域 (孟買)、亞太區域 (首爾)、亞太區域 (新加坡)、亞太區域 (雪梨)、亞太區域 (東京)、加拿大 (中部)、歐洲 (法蘭克福)、歐洲 (愛爾蘭)、歐洲 (倫敦)、歐洲 (巴黎)、歐洲 (斯德哥爾摩) 和南美洲 (聖保羅)。

其他資源