Apache Iceberg 已經成為管理大型數據集的熱門選擇,具備靈活性和可擴展性。目錄是 Iceberg 功能的核心,對於表格組織、一致性和元數據管理至關重要。本文將探討什麼是 Iceberg 目錄、其各種實現、使用案例和配置,提供對不同使用案例最佳目錄解決方案的理解。
什麼是 Iceberg 目錄?
在 Iceberg 中,目錄負責管理表格路徑,指向代表表格狀態的當前元數據文件。這種架構至關重要,因為它通過確保所有讀取者和寫入者訪問相同的表格狀態來實現原子性、一致性和高效查詢。不同的目錄實現以不同方式存儲這些元數據,從文件系統到專門的元數據存儲服務。
Iceberg 目錄的核心責任
Iceberg 目錄的基本責任包括:
- 映射表格路徑:將表格路徑(例如,“db.table”)鏈接到相應的元數據文件。
- 支持原子操作:確保在並發讀取/寫入過程中表格狀態的一致性。
- 元數據管理:存儲和管理元數據,確保可訪問性和一致性。
Iceberg目錄提供各種實珵以滿足不同的系統架構和儲存需求。讓我們來研究這些實珵及其適用於不同環境的情況。

Iceberg目錄的類型
1. Hadoop目錄
Hadoop目錄通常是最容易設定的,只需檔案系統即可。該目錄通過查找基於檔案時間戳記的表目錄中的最新元數檔案來管理元數據。然而,由於它依賴於檔級原子操作(一些儲存系統如S3缺乏),Hadoop目錄可能不適用於常見的並行寫入的生產環境。
配置示例
要使用Apache Spark配置Hadoop目錄:
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.12:0.14.0 \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.type=hadoop \
--conf spark.sql.catalog.my_catalog.warehouse=file:///D:/sparksetup/iceberg/spark_warehouse
在spark工作本身中設定目錄的不同方式:
SparkConf sparkConf = new SparkConf()
.setAppName("Example Spark App")
.setMaster("local[*]")
.set("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
.set("spark.sql.catalog.local","org.apache.iceberg.spark.SparkCatalog")
.set("spark.sql.catalog.local.type","hadoop")
.set("spark.sql.catalog.local.warehouse", "file:///D:/sparksetup/iceberg/spark_warehouse")
在上述示例中,我們將目錄名稱設置為“local”,如在spark中配置的“spark.sql.catalog.local“。這可以是您的名稱選擇。
優點:
- 簡單設置,無需外部元數庫。
- 適用於開發和測試環境。
缺點:
- 僅限於單個檔案系統(例如單個S3存儲桶)。
- 不建議用於生產
2. Hive目錄
Hive 目錄利用 Hive 元資料庫來管理元資料位置,使其與眾多大數據工具兼容。這個目錄被廣泛用於生產環境,因為它與現有基於 Hive 的基礎設施整合,並與多個查詢引擎兼容。
配置示例
要在 Spark 中使用 Hive 目錄:
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.12:0.14.0 \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.type=hive \
--conf spark.sql.catalog.my_catalog.uri=thrift://<metastore-host>:<port>
優點:
- 與現有大數據工具高度兼容。
- 與在地端和雲端設置靈活,不受雲端依賴。
缺點:
- 需要維護 Hive 元資料庫,可能增加操作複雜性。
- 缺乏多表事務支持,限制跨表操作的原子性
3. AWS Glue 目錄
AWS Glue 目錄是由 AWS 提供的托管元資料目錄,非常適合在 AWS 生態系統中進行大量投資的組織使用。它將 Iceberg 表元資料處理為 AWS Glue 中的表屬性,可以與其他 AWS 服務無縫集成。
配置示例
在 Spark 中設置 AWS Glue 與 Iceberg:
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-x.x_x.xx:x.x.x,software.amazon.awssdk:bundle:x.xx.xxx \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog \
--conf spark.sql.catalog.my_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO \
--conf spark.hadoop.fs.s3a.access.key=$AWS_ACCESS_KEY \
--conf spark.hadoop.fs.s3a.secret.key=$AWS_SECRET_ACCESS_KEY
優點:
- 托管服務,降低基礎設施和維護成本。
- 與 AWS 服務強大整合性。
缺點:
- 特定於 AWS,限制跨雲靈活性。
- 不支持多表事務
4. Project Nessie 目錄
專案 Nessie 提供了一種 “數據即程式碼” 的方法,允許進行數據版本控制。通過其類似 Git 的分支和標記功能,Nessie 使用戶能夠管理數據分支,類似於源代碼。它為多表和多語句事務提供了堅固的框架。
配置示例
要將 Nessie 配置為目錄:
spark-sql --packages "org.apache.iceberg:iceberg-spark-runtime-x.x_x.xx:x.x.x" \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.catalog-impl=org.apache.iceberg.nessie.NessieCatalog \
--conf spark.sql.catalog.my_catalog.uri=http://<host>:<port>
優點:
- 提供具有版本控制功能的 “數據即程式碼”。
- 支持多表事務。
缺點:
- 需要自行架設,增加基礎設施的複雜性。
- 與 Hive 或 AWS Glue 相比,工具支持有限
5. JDBC 目錄
JDBC 目錄允許您將元數據存儲在任何符合 JDBC 標準的數據庫中,如 PostgreSQL 或 MySQL。該目錄與雲服務無關,通過使用可靠的 RDBMS 系統確保高可用性。
配置示例
spark-sql --packages org.apache.iceberg:iceberg-spark-runtime-x.x_x.xx:x.x.x \
--conf spark.sql.catalog.my_catalog=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.my_catalog.catalog-impl=org.apache.iceberg.jdbc.JdbcCatalog \
--conf spark.sql.catalog.my_catalog.uri=jdbc:<protocol>://<host>:<port>/<database> \
--conf spark.sql.catalog.my_catalog.jdbc.user=<username> \
--conf spark.sql.catalog.my_catalog.jdbc.password=<password>
優點:
- 與現有 RDBMS 基礎設施相容並容易設置。
- 高可用性和與雲服務無關。
缺點:
- 不支持多表事務。
- 增加對所有訪問工具的 JDBC 驅動程序的依賴
6. Snowflake 目錄
Snowflake為Apache Iceberg表格提供強大支援,讓用戶可以利用Snowflake平台作為Iceberg目錄。這種整合結合了Snowflake的性能和查詢語義與Iceberg的開放表格格式的靈活性,從而實現對存儲在外部雲存儲中的大型數據集的高效管理。請參考snowflake文檔以獲取進一步的配置信息,請訪問此連結:link
優點:
- 無縫整合: 結合Snowflake的性能和查詢功能與Iceberg的開放表格格式,促進高效的數據管理。
- 全面平台支持: 提供全面的讀寫訪問權限,以及ACID事務、模式演進和時間旅行等功能。
- 簡化維護: Snowflake處理像壓縮和減少運營開銷等生命周期任務。
缺點:
- 雲端和區域限制: 外部卷必須與Snowflake帳戶位於相同的雲提供商和區域,限制跨雲或跨區域配置。
- 數據格式限制: 僅支持Apache Parquet文件格式,這可能不符合所有組織的數據格式偏好。
- 第三方客戶端限制:防止第三方客戶端修改Snowflake管理的Iceberg表中的數據,可能影響依賴外部工具的工作流程。
7. 基於REST的目錄
Iceberg支持基於REST的目錄以應對傳統目錄實現所涉及的幾個挑戰。
傳統目錄的挑戰
- 客戶端複雜性:傳統目錄通常需要為每種語言(Java、Python、Rust、Go)進行客戶端配置和依賴,導致不同編程語言和處理引擎之間存在不一致性。閱讀更多相關信息,請點擊這裡。
- 可擴展性限制:在客戶端層面管理元數據和表操作可能會引入瓶頸,影響大型數據環境中的性能和可擴展性。
採用REST目錄的好處
- 簡化客戶端集成:客戶端可以使用標準的HTTP協議與REST目錄交互,消除了複雜配置或依賴的需要。
- 可擴展性:REST目錄的服務端架構支持可擴展的元數據管理,應對不斷增長的數據集和並發訪問模式。
- 靈活性:組織可以在伺服器端實施自定義目錄邏輯,調整 REST 目錄以滿足特定要求,而無需改變客戶應用程式。
出現了幾種不同的 REST 目錄實現,每種都迎合特定組織需求:
- Gravitino:一個開源的 Iceberg REST 目錄服務,有助於與 Spark 和其他處理引擎集成,提供了一個簡單的設置來管理 Iceberg 表格。
- Tabular:一個托管服務,提供 REST 目錄接口,使組織能夠利用 Iceberg 的功能,而無需管理目錄基礎設施。詳情請參閱 Tabular。
- Apache Polaris:Apache Iceberg 的一個開源、功能齊全的目錄,實現 REST API,以確保在諸如 Apache Doris、Apache Flink、Apache Spark、StarRocks 和 Trino 等平台上實現無縫的多引擎互操作性。詳情請參閱 GitHub。
我最喜歡且簡單的方法之一是使用純 Java REST 實現嘗試 Iceberg 表格的 REST 目錄。請查看這裡的 GitHub 鏈接 here。
結論
選擇適合的 Apache Iceberg 目錄對於優化您的數據管理策略至關重要。以下是一個簡明的概述,以指導您的決策:
- Hadoop 目錄:最適合用於開發和測試環境,因為其簡單性。然而,在生產環境中進行並行寫入時可能會遇到一致性問題。
- Hive Metastore 目錄:這對於已有 Hive 基礎設施的組織來說是理想的選擇。它與廣泛的大數據工具兼容,並支持複雜的數據操作。然而,維護 Hive Metastore 服務可能會增加運營複雜性。
- AWS Glue 目錄:這對於深度投資於 AWS 生態系統的用戶來說是最佳選擇。它與 AWS 服務無縫集成,並減少自我管理元數據服務的需求。然而,它是 AWS 特定的,這可能會限制跨雲的靈活性。
- JDBC 目錄:適合喜好使用關聯數據庫進行元數據存儲的環境,允許使用任何符合 JDBC 的數據庫。這提供了靈活性並利用現有的 RDBMS 基礎設施,但可能會引入額外的依賴並需要仔細管理數據庫連接。
- REST 目錄:這對於需要標準化 API 進行目錄操作的場景非常理想,增強了多元處理引擎和語言之間的互操作性。它將目錄實現細節與客戶端解耦,但需要設置一個 REST 服務來處理目錄操作,這可能會增加初始設置的複雜性。
- 尼斯项目目录:這對需要對數據進行版本控制的組織非常適用,類似於 Git。它支持分支、標記和多表事務。它提供強大的數據管理功能,但需要部署和管理 Nessie 服務,這可能會增加操作負擔。
了解這些目錄選項及其配置將使您能夠做出明智的選擇,並優化您的數據湖或湖屋設置,以滿足您組織的特定需求。
Source:
https://dzone.com/articles/iceberg-catalogs-a-guide-for-data-engineers